【发布时间】:2015-12-24 20:46:03
【问题描述】:
根据Angular.io docs,变更检测有7种策略: CheckOnce、检查、CheckAlways、分离、OnPush、默认、OnPushObserve 我是这里的菜鸟,所以我真的很难理解。有人可以解释一下它们之间的区别。谢谢!
【问题讨论】:
标签: angular
根据Angular.io docs,变更检测有7种策略: CheckOnce、检查、CheckAlways、分离、OnPush、默认、OnPushObserve 我是这里的菜鸟,所以我真的很难理解。有人可以解释一下它们之间的区别。谢谢!
【问题讨论】:
标签: angular
不是对问题的严格回答,但仍可能为人们指明正确的方向:
显然,Angular 框架的消费者应该使用只有两种检测策略:Default和OnPush。
其他机制仅由 Angular 内部使用。有关更多详细信息,请查看 Angular 存储库中的 this 线程。
关于 OnPush 策略可能对其他人有所帮助的小说明:
当使用 OnPush 策略时,只有当 Immutable 对象从外部更新时才会自动获取更改(示例中的第 53 行)下面)。
如果“@Input() 属性”在组件内更新,那么我们需要通知更改检测器我们有更改,以便组件反映新值。我们使用 .markForCheck 和 will mark all ChangeDetectionStrategy ancestors as to be checked 来做到这一点(下例中的第 30 行)。
这里是一个例子:http://plnkr.co/edit/bp00rvDgAp8ljTLJEmHI?p=preview (从http://plnkr.co/edit/oT8F8m?p=preview更新和分叉)
玩转第 30 行:
// this.ref.markForCheck(); // uncomment it to manually apply changes
如果该行被注释掉,我们将不会看到组件使用组件构造函数内的超时设置的值更新(第 24 行)。
我们只会看到使用组件外部超时设置的值更新的组件(第 53 行)。
一旦我们取消注释该行,组件就会使用组件内部超时设置的值进行更新。
【讨论】: