11

这篇文章提到

不过,常春藤为未来开辟了一些可能性。现在应该可以在没有 zone.js 的情况下运行应用程序,并且可以半手动地处理更改检测(有点像使用 React)。这些 API 已经存在,但只是实验性的,没有文档记录,并且可能会在不久的将来发生变化。

我认为在 Ivy 之前已经可以在没有 zone.js 的情况下运行应用程序。Ivy 是否允许半手动处理变更检测?那些实验性 API 在哪里?有文档吗?Ivy 还使用 zone.js 吗?

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

4

1 回答 1

16

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

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

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

它会导致什么问题? 模块是为我们设置区域的人。区域是自动触发更改检测的区域。如果我们将在模块之外渲染组件,我们将不会进行自动更改检测。

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

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

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

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

ɵɵdirectiveInject()- 在函数中注入 InjectionToken,而不使用构造函数。

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

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

如果你想阅读更多,我写了一篇关于这个主题的完整博客文章,包括很多代码示例。你可以在这里找到它——“独立组件在 Ivy 发布后的未来

我也在 NG-DE 2019 上发表过演讲——“ Bye Bye NgModules

于 2019-11-17T06:48:15.307 回答