Angular的ngOnChanges和变更检测策略似乎是矛盾的?

13 浏览
0 Comments

Angular的ngOnChanges和变更检测策略似乎是矛盾的?

当输入绑定的引用类型发生更改时,NgChanges会运行。即使更改了像这样的对象的value属性,例如:

{

value: 2

}

如果其value属性更改,ngchanges不会运行。这是因为Angular的默认变更检测策略比较的是引用。

然而,当我们考虑到两种变更检测策略时,这对我来说似乎是矛盾的:

默认策略 - 组件的变更检测发生在绑定发生变化时 - 但根据上述内容,它不会识别引用类型的输入发生的更改,除非引用的引用发生了变化。换句话说,只有在值类型值发生变化或引用类型引用发生变化时,变更检测才会运行。

OnPush策略 - 只有在值类型值发生变化或引用发生变化时,变更检测才会运行。

显然,默认的变更检测不像我理解的那样工作,否则它将与OnPush相同,然而onChanges生命周期钩子似乎只按照OnPush的规则触发。

0
0 Comments

Angular的ngOnChanges和变更检测策略似乎存在矛盾?这个问题的出现原因是Angular会比较先前和新的输入值的引用。默认策略和OnPush策略的区别在于Angular触发变更检测的时间。

使用默认策略时,Angular会进行脏检查,这意味着它会每次检查应用程序中是否有变化:它会对每个浏览器事件、任何HTTP调用、计时器等进行检查。在大型应用程序中,这种方法对性能有很大影响。

而使用OnPush变更检测时,Angular只会在组件的输入发生变化时才检查该组件(它依赖于不可变性的概念来判断组件何时变化)。

如果你想深入了解Angular变更检测,我建议你阅读Max Koretskyi撰写的这篇文章,他详细解释了变更检测的工作原理。

链接已失效。这是新链接 - Everything you need to know about change detection in Angular

0