Angular Ivy 在手动更改检测方面特别允许我们做什么?

What does Angular Ivy specifically allow us to do in regards to manual change detection?

This article 提到

Ivy opens a few possibilities for the future though. It should now be possible to run an application without zone.js, and to semi-manually handle change detection (a bit like you would with React). These APIs already exist but are experimental, not documented, and will probably change in the near future.

我认为在 Ivy 之前 运行 没有 zone.js 的申请已经是可能的。 Ivy 是否允许半手动处理变更检测?那些实验性 API 在哪里?任何文件? Ivy 还在使用 zone.js 吗?

我的目标是通过手动触发将更改检测限制在最低限度。这样做的最佳选择是什么。具体来说,使用 Ivy 时最好的选择是什么。

这是一个很大的话题,但我会尽力回答。

这个想法实际上是渲染组件而不在任何模块中声明它们。

我们为什么要这样做? 很简单——模块不仅仅是组件。模块有区域、提供者、注入器、DI 等等。对我们很多人来说,模块代表应用程序。有时我们只想创建一个简单的组件并在另一个组件中渲染它。

会造成什么问题? 模块是为我们设置区域的模块。区域是自动触发变化检测的区域。如果我们将在模块外呈现组件,我们将不会有自动更改检测。

因此,对于 Ivy,我们有一些新的 APIS 可以帮助我们:

ɵrenderComponent() - 无需在模块中声明即可呈现组件。

ɵdetectChanges(); - 手动触发变化检测,但是,它只是 @angular/core 的一个函数,你不再需要 DI 来注入 ChangeDetectorRef

ɵmarkDirty() - 标记要在下一个变更检测周期检查的组件。

ɵɵdirectiveInject() - 在不使用构造函数的情况下,在函数中注入一个 InjectionToken。

如果您问这个 ɵ 前缀所有这些新 API 的标志是什么,那意味着这些功能仍处于试验阶段,您不应该将它们用于生产。这也是为什么没有记录它们的原因。

对于你的问题 - 如果你想尽量减少组件中 CD 的使用,只需使用 renderComponent 函数渲染它们,并自行处理 CD。

如果您想阅读更多内容,我写了一篇完整的博客 post 正是关于这个主题,包括很多代码示例。你可以在这里找到它 - “The future of standalone components in post Ivy release days

我也在 NG-DE 2019 上讲过 - "Bye Bye NgModules"