我目前正在使用Ivy开发非常轻量级的角元素(v10.1.2)。
当我没有在我的zone.js中导入polyfills.ts并在我的main.ts中“禁用”它时,如下所示:
platformBrowserDynamic()
.bootstrapModule(AppModule, { ngZone: 'noop' })
.catch(err => console.error(err));那么,我在组件上设置了什么样的ChangeDetectionStrategy仍然相关吗?
因此,如果我通过将组件标记为脏(ɵmarkDirty as markDirty)并具有默认的ChangeDetectionStrategy来手动触发它,ChangeDetectionStrategy会遍历整个树吗?如果我把它设置为changeDetection: ChangeDetectionStrategy.OnPush,它会检查手头的组件吗?
发布于 2020-09-24 10:18:46
实际上,我在大媒体文章中提出了同样的问题,并得到了以下答复(简写):
当我们禁用Zone.js时,我们仍然有更改检测器,但是没有人会为我们运行更改检测。我们得把这个部件标记成脏的。
这实际上回答了我的问题,因为我认为我们没有变化检测器,因为我们将是变化检测器(因为我们自己标记组件脏了)。
它继续下去:
至于ChangeDetectionStrategy,它稍微有用,因为我在模板中使用的所有对象都是不可变的。让我解释一下为什么这很重要。当更改检测运行时,它将检查我在模板中使用的任何对象是否已更改。如果我使用的是默认更改检测策略,它将使用深度相等检查检查任何对象,然后沿着组件树进入子节点并执行相同的相等检查。在我的例子中,OnPush将执行引用相等检查,这就足够了,因为我使用的所有对象都是不可变的,而且我只有一个组件,没有任何子组件。 总之,我禁用了Zone.js以减少包大小,因为我在任何时候都会手动触发更改检测,并且启用了OnPush,因为我的所有对象都是不可变的,而且我正在通过减少检查数量来提高实际更改检测的性能。
所以我的外卖我的结论是
当禁用zone.js (我们仍然有一个ChangeDetector)时,通过使用默认策略(而不是OnPush)并手动触发更改检测(使用markDirty),ChangeDetector将检查整个树(假设每个组件都有默认的更改检测策略)。但是当使用OnPush时,ChangeDetector只检查手头的组件。
https://stackoverflow.com/questions/64030656
复制相似问题