Angular Ivy具体允许我们在手动变更检测方面做些什么?

12

这篇文章提到:

Ivy为未来带来了一些可能性。现在可以不使用zone.js运行应用程序,并且可以半手动处理变更检测(有点像React)。这些API已经存在,但是它们是实验性的,未记录,并且很可能会在不久的将来发生变化。

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

我的目标是通过手动触发对其进行最少量的变更检测。在使用Ivy时,最佳选择是什么?

1个回答

21
那是一个大主题,在这里涵盖很难,但我会尝试回答。
其实这个想法是在不声明任何模块内部的情况下渲染组件。
为什么我们要这样做呢?很简单-模块不仅仅是组件。模块有区域、提供者、注入器、DI等等。对于我们大多数人来说,模块代表应用程序。有时我们只想创建一个简单的组件并将其呈现在另一个组件中。
这会带来什么问题呢?模块是为我们设置区域的对象。区域是自动触发变更检测的对象。如果我们在模块外部呈现组件,我们将没有自动变更检测。
所以,使用Ivy,我们有一些新的API可以帮助我们:
“ɵrenderComponent()” - 可以在不声明模块的情况下渲染组件。
“ɵdetectChanges();” - 手动触发变更检测,但它只是从“@angular / core”中的函数,您不再需要DI来注入“ChangeDetectorRef”
“ɵmarkDirty()” - 在下一个变更检测周期中标记组件以进行检查。
“ɵɵdirectiveInject()” - 通过函数方式注入InjectionToken,而无需使用构造函数。
如果你想知道这个前缀所有的新API“ɵ”的意思,这意味着这些函数仍然是实验性的,你不应该在生产中使用它们。这也是它们没有文档的原因。
对于你的问题 - 如果你想最小化组件中CD的使用,只需使用renderComponent函数进行呈现,并自己处理CD。
如果你想了解更多信息,我写了一篇完整的博客文章,涵盖了许多代码示例。你可以在这里找到它 - "在后Ivy版本发布日中独立组件的未来"
我还在NG-DE 2019上发表了关于此主题的演讲 - "再见NgModules"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接