这是一个很大的话题,但我会尽力回答。
这个想法实际上是渲染组件而不在任何模块中声明它们。
为什么我们想做这样的事情?
很简单——模块不仅仅是组件。模块有区域、提供者、注入器、DI 等等。对我们很多人来说,模块代表应用程序。有时我们只想创建一个简单的组件并在另一个组件中渲染它。
它会导致什么问题?
模块是为我们设置区域的人。区域是自动触发更改检测的区域。如果我们将在模块之外渲染组件,我们将不会进行自动更改检测。
因此,对于 Ivy,我们有一些新的 API 可以帮助我们:
ɵrenderComponent()
- 无需在模块中声明即可渲染组件。
ɵdetectChanges();
- 手动触发变更检测,但是,它只是一个函数@angular/core
,你不再需要 DI 来注入ChangeDetectorRef
ɵmarkDirty()
- 标记要在下一个更改检测周期中检查的组件。
ɵɵdirectiveInject()
- 在函数中注入 InjectionToken,而不使用构造函数。
如果您问ɵ
所有这些新 API 前缀的这个标志是什么,这意味着这些功能仍处于试验阶段,您不应该将它们用于生产。这也是为什么它们没有被记录在案的原因。
对于您的问题 - 如果您想尽量减少组件中 CD 的使用,只需使用renderComponent
功能渲染它们,并自己处理 CD。
如果你想阅读更多,我写了一篇关于这个主题的完整博客文章,包括很多代码示例。你可以在这里找到它——“独立组件在 Ivy 发布后的未来”
我也在 NG-DE 2019 上发表过演讲——“ Bye Bye NgModules ”