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

Angular Ivy特别允许我们在手动变化检测方面做什么?,angular,angular2-changedetection,zone,angular-ivy,Angular,Angular2 Changedetection,Zone,Angular Ivy,提到 不过,常春藤为未来带来了一些可能性。现在应该可以在没有zone.js的情况下运行应用程序,并半手动处理更改检测(有点像React)。这些API已经存在,但是是实验性的,没有文档记录,并且在不久的将来可能会改变 我认为在Ivy之前不使用zone.js就可以运行应用程序。常春藤是否允许半手动处理变更检测?那些实验API在哪里?有医生吗?常春藤还使用zone.js吗 我的目标是通过手动触发来将更改检测限制在最低限度。这样做的最佳选择是什么。具体来说,使用常春藤的最佳选择是什么 这是一个很大的话题

提到

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

我认为在Ivy之前不使用zone.js就可以运行应用程序。常春藤是否允许半手动处理变更检测?那些实验API在哪里?有医生吗?常春藤还使用zone.js吗


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

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

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

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

它会导致什么问题? 模块是为我们设置区域的模块。区域是自动触发更改检测的区域。如果我们在模块外部呈现组件,我们就不会有自动更改检测

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

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

ɵdetectChanges()
-手动触发更改检测,但是,这只是来自
@angular/core
的一个函数,您不再需要DI来注入
ChangeDetectorRef

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

ɵɵdirectiveInjection()
-在函数中注入注入令牌,而不使用构造函数

如果你问这些新API的前缀是什么,这意味着这些函数仍然是实验性的,你还不应该在生产中使用它们。这也是为什么它们没有被记录的原因

对于您的问题-如果您想尽量减少组件中CD的使用,只需使用
renderComponent
函数渲染它们,然后自己处理CD即可

如果你想读更多,我写了一篇关于这个主题的完整博文,包括很多代码示例。您可以在这里找到它-“”


我也在2019年的NG-DE上做了一个关于它的演讲-“

@Eli谢谢:)