Angular 角度变化检测策略和禁用zone.js
我目前正在使用Ivy(v10.1.2)开发非常轻量级的角度元素 当我在我的Angular 角度变化检测策略和禁用zone.js,angular,zonejs,Angular,Zonejs,我目前正在使用Ivy(v10.1.2)开发非常轻量级的角度元素 当我在我的polyfills.ts中不导入zone.js并在我的main.ts中“禁用”它时,如下所示: platformBrowserDynamic() .bootstrapModule(AppModule, { ngZone: 'noop' }) .catch(err => console.error(err)); 那么,我在组件上设置了什么样的ChangeDetectionStrategy是否仍然相关 因此,如
polyfills.ts
中不导入zone.js
并在我的main.ts中“禁用”它时,如下所示:
platformBrowserDynamic()
.bootstrapModule(AppModule, { ngZone: 'noop' })
.catch(err => console.error(err));
那么,我在组件上设置了什么样的ChangeDetectionStrategy是否仍然相关
因此,如果我通过将组件标记为dirty(ɵmarkDirty为markDirty
)并使用默认的ChangeDetectionStrategy手动触发它,Noop ChangeDetector会遍历整个树吗?如果我将其设置为changeDetection:ChangeDetectionStrategy.OnPush,它会检查手头的组件吗?我实际上在a中问了相同的问题,并得到了以下回答(简短版本):
当我们禁用Zone.js时,我们仍然有变更检测器,但没有人
将为我们运行更改检测。我们必须将部件标记为
弄脏我们自己
这实际上回答了我的问题,因为我认为我们没有变更检测器,因为我们将成为变更检测器(因为我们自己将组件标记为脏的)
它继续说:
至于ChangeDetectionStrategy,它有点有用,因为
我在模板中使用的对象是不可变的。让我
解释为什么这很重要。当变更检测运行时,它将进行检查
如果我在模板中使用的任何对象已更改或未更改。如果我是
使用默认的变化检测策略,它将检查任何对象
通过深度相等性检查,它将进入组件树
并进行相同的平等性检查。就我而言,OnPush
将执行引用相等性检查,这就足够了,因为
我正在使用的对象中有许多是不可变的,除此之外,我只
有一个没有任何子组件的组件
总之,我禁用了Zone.js以减小捆绑包大小,因为我
在需要时手动触发更改检测,并且
启用OnPush,因为我的所有对象都是不可变的,而我是
通过减少
支票数量
所以我的外卖和结论是:
禁用zone.js(我们仍然有一个ChangeDetector)时,通过使用默认策略(而不是OnPush)并手动触发更改检测(使用markDirty),ChangeDetector将检查整个树(假设每个组件都有默认的更改检测策略)。
但使用OnPush时,ChangeDetector只会检查手头的组件