Angular ChangeDetectionStrategy and disabling zone.js



我目前正在使用Ivy(v10.1.2(开发非常轻量级的Angular Elements。

当我不在我的CCD_ 2中导入CCD_;禁用";它在我的main.ts中如下:

platformBrowserDynamic()
.bootstrapModule(AppModule, { ngZone: 'noop' })
.catch(err => console.error(err));

那么我在组件上设置了什么样的ChangeDetectionStrategy仍然相关吗?

那么,如果我通过将组件标记为dirty(ɵmarkDirty as markDirty(并使用默认的ChangeDetectionStrategy手动触发它,Noop ChangeDetector会遍历整个树吗?如果我将其设置为changeDetection: ChangeDetectionStrategy.OnPush,它会只是检查手头的组件吗?

实际上,我在一篇很棒的媒体文章中问了同样的问题,得到了以下回复(简短版本(:

当我们禁用Zone.js时,我们仍然有更改检测器,但没有将为我们运行更改检测。我们必须将组件标记为弄脏自己。

这实际上回答了我的问题,因为我认为我们没有变化检测器,因为我们将是变化检测器(因为我们自己将组件标记为脏的(。

它继续:

至于ChangeDetectionStrategy,它稍微有用一点,因为我在模板中使用的所有对象都是不可变的。让我来解释为什么这很重要。当"更改检测"运行时,它将进行检查如果我在模板中使用的任何对象是否发生了更改。如果我是使用默认更改检测策略,它将检查任何对象通过深度相等检查,它将进入组件树对孩子们进行同样的平等检查。就我而言,OnPush将进行引用相等性检查,这就足够了,因为所有我正在使用的对象中有一个是不可变的,除此之外,我只有一个没有任何子组件的组件。

总之,我禁用了Zone.js以减小捆绑包大小,因为我无论何时手动触发更改检测启用了OnPush,因为我的所有对象都是不可变的通过减少检查次数。

所以我的结论

当禁用zone.js时(我们仍然有一个ChangeDetector(,通过使用默认策略(而不是OnPush(并手动触发更改检测(使用markDirty(,ChangeDetectors将检查整个树(假设每个组件都有默认的更改检测策略(。但是当使用OnPush时,ChangeDetector将只检查手头的组件。

最新更新