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

max*_*pre 8 zone angular2-changedetection angular angular-ivy

本文提到

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

我认为已经可以在Ivy之前运行没有zone.js的应用程序了。常春藤是否允许半手动处理变更检测?这些实验性API在哪里?有文件吗?常春藤仍然使用zone.js吗?

我的目标是通过手动触发更改检测来将更改检测降至最低。这样做的最佳选择是什么。特别是使用常春藤时最好的选择是什么。

Eli*_*ssy 10

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

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

我们为什么要做这样的事情? 这很简单-模块不仅仅是组件。模块具有区域,提供程序,注入器,DI等。我们中许多人的模块代表应用程序。有时我们只想创建一个简单的组件并将其呈现在另一个组件中。

它会引起什么问题? 模块是为我们设置区域的模块。区域是自动触发更改检测的区域。如果我们要在模块外部渲染组件,则不会具有自动更改检测功能。

因此,使用常春藤,我们有一些新的APIS可以帮助我们:

?renderComponent() -可以渲染组件而无需在模块中声明它。

?detectChanges();-要手动触发变更检测,但这只是其中的一个功能@angular/core,您不再需要DI来注入ChangeDetectorRef

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

??directiveInject() -在不使用构造函数的情况下,通过功能注入InjectionToken。

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

对于您的问题-如果您想最大程度地减少组件中CD的使用,只需对它们进行renderComponent功能渲染,然后自己处理CD。

如果您想了解更多信息,我写了一篇关于该主题的完整博客文章,其中包括许多代码示例。您可以在这里找到它-“ Ivy发布后独立组件的未来

我还在NG-DE 2019中进行了演讲-“ Bye Bye NgModules