Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 角2变化检测器_Angular_Angular2 Changedetection - Fatal编程技术网

Angular 角2变化检测器

Angular 角2变化检测器,angular,angular2-changedetection,Angular,Angular2 Changedetection,我试图理解Angular 2应用中的变化检测器机制。我想我在读了几篇文章后取得了一些进步:)但不是很多。据我所知,情况是这样的: 当组件未使用OnPush策略时,它将在以下情况下运行相关的更改检测器: 1) 应用程序的任何部分都会启动DOM事件 2) 应用程序的任何部分都可以解析HTTP请求 3) 任何一方都可以使用setTimeout或setInterval执行异步代码 将在组件树中从上到下检查所有组件 当组件使用OnPush策略时,它将在以下情况下运行更改检测器: 1) 任何@Input更改

我试图理解Angular 2应用中的变化检测器机制。我想我在读了几篇文章后取得了一些进步:)但不是很多。据我所知,情况是这样的:

当组件未使用OnPush策略时,它将在以下情况下运行相关的更改检测器:

1) 应用程序的任何部分都会启动DOM事件 2) 应用程序的任何部分都可以解析HTTP请求 3) 任何一方都可以使用setTimeout或setInterval执行异步代码

将在组件树中从上到下检查所有组件

当组件使用OnPush策略时,它将在以下情况下运行更改检测器:

1) 任何@Input更改其引用(此处涉及不变性) 2) 组件(或子组件)启动事件 3) 可观察到的发射事件。在这种情况下,如果我们使用Observable作为@Input,那么我们必须在变更检测器中调用markForCheck()方法

OnPush组件也会将其所有组件子树标记为不运行更改检测

更改检测始终从根组件开始,并从组件树的顶部到底部进行

因此,我构建了一个示例应用程序(本文末尾的链接),其中包含三个级别(父级、子级和子级)的组件树。第二级组件是OnPush组件。所有组件都附加了click事件,因此当单击其中任何组件时,将执行更改检测器。执行ngAfterViewChecked钩子时,我将组件颜色更改为红色几秒钟

我不明白的是,为什么当我点击grand child组件时,所有的儿童变化检测器都在运行。我以为只有在子树中单击的从父到孙儿的那一个才会被执行

单击时,父项是相同的。所有childs探测器均已执行。为什么

任何好人都能告诉我发生了什么事

谢谢


我觉得您对变更检测的理解是正确的。可能有两个误解,我想强调,这可能会帮助你解决这个难题

1-nAfterViewChecked与是否检测到更改无关,文档[1]说“请注意,Angular经常调用AfterViewChecked,通常是在没有感兴趣的更改时。编写精益挂钩方法以避免性能问题。”举个例子

您可能想改用ngOnChanges()[2]。文档中说“Angular只在输入属性的值更改时调用钩子”

2-当从组件内更改组件的状态(设置超时、启动rx订阅等)时,您将希望注入ChangeDetectorRef并调用ChangeDetectorRef.markForCheck()[3]

这是因为OnPush只考虑更改的@输入ngOnChanges()不会被触发,因为不会更改任何输入

[1]

[2]


[3]

这是YouTube上一段视频的链接。这是迄今为止我在Angular2中理解ChangeDetection所遇到的最好的一个。谢谢,我几天前在开始使用实验应用程序之前看到了它:)嗨,谢谢你的回答!!。然后。。。我认为没有可靠的方法知道何时触发更改检测器,因为ngOnChanges()方法只有在@Input()发生更改时才会被调用,但从组件触发事件并不是这种情况,我已经对此进行了一些讨论,但基本上它看起来像是在angular框架之外进行更新,您可以使用ChangeDetectorRef.markForCheck()将组件标记为已更改,但确实需要单独管理任何其他位置的组件。然而,一种常见的模式是使用@Output向上与父母沟通,而不是依赖角度框架变化检测本身。你想试试吗?