NgChanges on在输入绑定上运行-如果输入是引用类型-引用更改时。即是这样的对象:
{ 价值:2 }
如果的value属性更改,则不会导致ngchanges运行。这是因为Angular默认更改检测策略会比较引用。
Angular2 change detection: ngOnChanges not firing for nested object
但是,当我们考虑两种变更检测策略时,这似乎与我矛盾:
默认值-绑定更改时会进行组件更改检测-但根据以上所述,它无法识别引用类型的引用未更改的输入的更改。换句话说,只有在值类型值更改或引用类型引用更改时才运行更改检测。
OnPush-更改检测仅运行值类型值更改或引用更改时。
很明显,默认更改检测无法像我理解的那样工作,或者它与OnPush相同,但是onChanges生命周期挂钩似乎仅在与OnPush相同的规则下触发。
答案 0 :(得分:0)
Angular将始终比较先前输入值和新输入值的引用。 当角度触发更改检测时,默认策略和OnPush策略之间的区别。
使用Default
策略,Angular会进行脏检查,这意味着它将每次检查您的应用程序中是否有更改:它将对每个浏览器事件,任何http调用,计时器...进行检查。在大型应用程序中,这种方法对性能有很大影响。
使用OnPush
更改检测,Angular仅在组件的输入之一发生更改时才检查组件(它依靠inmutability的概念来知道组件何时更改)。
如果您想更深入地学习Angular Change Detection,我建议您阅读Max Koretskyi撰写的this article,他解释了Change Detection的工作原理。