[英]Angular2 Change Detection with Zones
我想知道是否可以通过将所有组件逻辑(包括组件内部的非组件指令的逻辑)包装在区域中来将所有异步事件和回调追溯到特定的源组件,那么仅需要检查源组件的变化假定所有更改都遵循单向流,则所有子组件的源输入都会发生变化。
这种理解声音吗?
Angular2中是否提供此更改检测策略?
为什么在发生任何异步(XHR)事件后Angular2会检测所有组件上的更改?
一个完整的Angular应用程序在单个区域中运行。 Angular使用该区域修补异步API,并在每次发生某些异步事件时使用来自这些修补API的通知来运行更改检测。
单向流适用于[prop]="value"
绑定,该绑定仅在父级到子级之间起作用。
角行程从根到叶的变化检测。
如果为组件配置了ChangeDetectionStrategy.OnPush
,则更改检测将跳过这些组件(及其后代),直到某些绑定(输入)已更改。
还有其他优化CD的策略。
例如,可观察和承诺,它们主动通知更改,而无需更改检测。
保证不改变其属性值的不可变对象。
更新
Angular不知道事件处理程序已更改了什么值。 组件的属性,全局服务的属性,传递的对象引用的属性....它只是假设当调用事件处理程序时,可能某些内容已更改,然后运行完整的更改检测周期以传播来自以下对象的所有绑定父母对孩子。
子代父绑定无论如何都是事件,因此在更改检测期间不会更新。
...通过将所有组件逻辑(包括组件内部的非组件指令的逻辑)包装在一个区域中,则只需要检查源组件的更改以及源组件输入已更改的所有子组件,并假设所有更改遵循单向流。 这种理解声音吗?
当触发模板绑定事件时,例如(click)="doSomething()"
– doSomething()
方法可以自由更改任何组件或应用程序数据。 根据Angular docs ,模板语句 (例如我们的doSomething()
事件处理程序doSomething()
不受单向流规则的约束:
响应事件是Angular的“单向数据流”的另一面。 在此事件循环过程中,我们可以随时随地更改任何内容。
这就是为什么默认情况下,在事件触发后,Angular的更改检测必须检查每个组件中的每个模板绑定的原因。 (好吧,在Angular区域内发生事件之后。)Angular不知道可能发生了什么变化,它必须发现发生了什么变化。
单向流规则适用于模板表达式,例如{{some expression}}
或[childInputProperty]="parent expression"
或者如果您实现输入属性设置器方法: @Input() set childInputProperty(variableName:type) { ... }
。
Angular2中是否提供此更改检测策略?
不可以,因为它将严重限制事件处理程序的功能。 脏检查每个模板绑定可能不是检测更改的最有效方法,但是它使我们更容易编写事件处理程序(即,编写应用程序)。
为什么在发生任何异步(XHR)事件后Angular2会检测所有组件上的更改?
Angular不想限制我们在事件处理程序中可以做什么。 绑定在ComponentA模板中的事件处理程序可以更改ComponentA本地的数据,但它也可以更改服务中的数据(因此它可以更改其他组件可见的数据),并且可以更改其他组件中的数据,例如,通过在其他组件上调用公共API /方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.