2

我想知道是否所有异步事件和回调都可以通过将所有组件逻辑(包括组件内的非组件指令的逻辑)包装在一个区域中来追溯到特定的源组件,然后只需要检查源组件的更改假设所有更改都遵循单向流,则任何具有来自源组件的更改输入的子组件。

这种理解合理吗?

这种变化检测策略在 Angular2 中可用吗?

为什么 Angular2 在任何异步 (XHR) 事件之后检测所有组件的变化?

4

2 回答 2

1

一个完整的 Angular 应用程序在单个区域中运行。Angular 使用该区域来修补异步 API,并在每次发生某些异步事件时使用来自这些修补 API 的通知来运行更改检测。

单向流用于[prop]="value"仅在父子之间有效的绑定。

Angular 运行从根到叶的变化检测。

如果ChangeDetectionStrategy.OnPush为组件配置,更改检测会跳过这些组件(及其后代),直到某些绑定(输入)发生更改。

还有其他优化 CD 的策略。

  • 例如 observables 和 Promise,它们主动通知更改并且不需要更改检测。

  • 保证不会更改其属性值的不可变对象。

更新

Angular 不知道事件处理程序改变了哪些值。组件的属性、全局服务的属性、传递的对象引用的属性……它只是假设当调用事件处理程序时可能发生了某些变化,然后运行一个完整的更改检测周期以传播所有绑定父母对孩子。

子做父绑定无论如何都是事件,因此在更改检测期间不会更新。

于 2016-06-28T15:32:02.620 回答
1

...通过将所有组件逻辑(包括组件内的非组件指令的逻辑)包装在一个区域中,然后只需要检查该源组件以及具有来自源组件的更改输入的任何子组件的更改,假设所有更改遵循单向流动。这种理解合理吗?

当模板绑定事件触发时——例如(click)="doSomething()"——该doSomething()方法可以自由地更改任何组件或应用程序数据。根据Angular 文档,模板语句,例如我们的doSomething()事件处理程序,不受单向流规则的约束:

响应事件是 Angular 的“单向数据流”的另一面。在事件循环的这一轮中,我们可以在任何地方自由更改任何内容。

这就是为什么默认情况下,Angular 的变更检测必须在事件触发后检查每个组件中的每个模板绑定。(好吧,在 Angular 区域内的事件触发之后。)Angular 不知道可能发生了什么变化……它必须发现发生了什么变化。

单向流规则适用于模板表达式,例如{{some expression}}or[childInputProperty]="parent expression"或者如果您实现了输入属性设置方法: @Input() set childInputProperty(variableName:type) { ... }.

这种变化检测策略在 Angular2 中可用吗?

不,因为它会严重限制事件处理程序可以做什么。脏检查每个模板绑定可能不是检测更改的最有效方法,但它使我们更容易编写事件处理程序(即编写我们的应用程序)。

为什么 Angular2 在任何异步 (XHR) 事件之后检测所有组件的变化?

Angular 不想限制我们在事件处理程序中可以做的事情。绑定在 ComponentA 模板中的事件处理程序可以更改 ComponentA 本地的数据,但它也可以更改服务中的数据(因此它可以更改其他组件可见的数据),它可以更改其他组件中的数据,例如,通过在其他组件上调用公共 API/方法。

于 2016-06-28T19:00:57.427 回答