Angular ngOnChanges 和变化检测策略似乎是矛盾的?
Posted
技术标签:
【中文标题】Angular ngOnChanges 和变化检测策略似乎是矛盾的?【英文标题】:Angular ngOnChanges and the change detection strategies appear to be contradictory? 【发布时间】:2019-08-20 09:42:38 【问题描述】:NgChanges on 在输入绑定上运行 - 如果输入是引用类型 - 当引用更改时。即这样的对象:
值:2
如果其 value 属性发生更改,则不会导致 ngchanges 运行。这是因为 Angular 默认更改检测策略会比较引用。
Angular2 change detection: ngOnChanges not firing for nested object
但是,当我们考虑这两种变化检测策略时,我觉得这似乎是矛盾的:
默认值 - 当绑定更改时发生组件更改检测 - 但根据上述,这不会识别引用类型的引用未更改的输入上的更改。或者换句话说,更改检测仅在值类型值更改或引用类型引用更改时运行。
OnPush - 更改检测仅在值类型值更改或引用更改时运行。
显然,默认更改检测不像我理解的那样工作,或者它与 OnPush 相同,但 onChanges 生命周期挂钩似乎只在与 OnPush 相同的规则下触发。
【问题讨论】:
【参考方案1】:Angular 总是会比较前一个和新输入值的引用。 Default 和 OnPush 策略之间的区别在于何时 Angular 触发更改检测。
使用Default
策略,Angular 会进行脏检查,这意味着它每次都会检查你的应用程序中是否发生了变化:它会检查每个浏览器事件、任何 HTTP 调用、计时器……。应用这种方法对性能有很大影响。
使用OnPush
更改检测,Angular 只会在组件的一个输入发生更改时检查组件(它依赖immutability 的概念来了解组件何时更改)。
如果您想更深入地了解 Angular Change Detection,我建议您阅读 Max Koretskyi 撰写的 this article,他详细解释了 Change Detection 的工作原理。
【讨论】:
链接已失效。这是新链接 - Everything you need to know about change detection in Angular以上是关于Angular ngOnChanges 和变化检测策略似乎是矛盾的?的主要内容,如果未能解决你的问题,请参考以下文章
IONIC2/Angular2 ngOnChange 不起作用
在父级的 ngOnDestroy 之后未调用 Angular ngOnChanges