首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >角ChangeDetectionStrategy和禁用zone.js

角ChangeDetectionStrategy和禁用zone.js
EN

Stack Overflow用户
提问于 2020-09-23 14:53:02
回答 1查看 2.4K关注 0票数 1

我目前正在使用Ivy开发非常轻量级的角元素(v10.1.2)。

当我没有在我的zone.js中导入polyfills.ts并在我的main.ts中“禁用”它时,如下所示:

代码语言:javascript
复制
platformBrowserDynamic()
  .bootstrapModule(AppModule, { ngZone: 'noop' })
  .catch(err => console.error(err));

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

因此,如果我通过将组件标记为脏(ɵmarkDirty as markDirty)并具有默认的ChangeDetectionStrategy来手动触发它,ChangeDetectionStrategy会遍历整个树吗?如果我把它设置为changeDetection: ChangeDetectionStrategy.OnPush,它会检查手头的组件吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-24 10:18:46

实际上,我在大媒体文章中提出了同样的问题,并得到了以下答复(简写):

当我们禁用Zone.js时,我们仍然有更改检测器,但是没有人会为我们运行更改检测。我们得把这个部件标记成脏的。

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

它继续下去:

至于ChangeDetectionStrategy,它稍微有用,因为我在模板中使用的所有对象都是不可变的。让我解释一下为什么这很重要。当更改检测运行时,它将检查我在模板中使用的任何对象是否已更改。如果我使用的是默认更改检测策略,它将使用深度相等检查检查任何对象,然后沿着组件树进入子节点并执行相同的相等检查。在我的例子中,OnPush将执行引用相等检查,这就足够了,因为我使用的所有对象都是不可变的,而且我只有一个组件,没有任何子组件。 总之,我禁用了Zone.js以减少包大小,因为我在任何时候都会手动触发更改检测,并且启用了OnPush,因为我的所有对象都是不可变的,而且我正在通过减少检查数量来提高实际更改检测的性能。

所以我的外卖我的结论是

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64030656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档