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

标签 angular angular2-changedetection zone angular-ivy

This article提到

Ivy opens a few possibilities for the future though. It should now be possible to run an application without zone.js, and to semi-manually handle change detection (a bit like you would with React). These APIs already exist but are experimental, not documented, and will probably change in the near future.



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

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

最佳答案

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

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

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

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

因此,对于 Ivy,我们有一些新的 API 可以帮助我们:
ɵrenderComponent() - 无需在模块中声明即可渲染组件。
ɵdetectChanges(); - 手动触发变更检测,但是,它只是 @angular/core 中的一个函数并且您不再需要 DI 来注入(inject) ChangeDetectorRefɵmarkDirty() - 标记要在下一个更改检测周期中检查的组件。
ɵɵdirectiveInject() - 在函数中注入(inject) InjectionToken,而不使用构造函数。

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

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

如果你想阅读更多,我写了一篇关于这个主题的完整博客文章,包括很多代码示例。你可以在这里找到它——“The future of standalone components in post Ivy release days

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

关于angular - Angular Ivy 在手动更改检测方面特别允许我们做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58784993/

相关文章:

javascript - FullCalendar:仅在当前 View 的 ListView 中显示事件

angular - @HostListener 导致更改检测在我监听外部点击时触发太多次

angular - onPush 检测策略在 Angular 8 中不起作用

java - 在 Java 中解析绑定(bind) 9.x 区域文件的库?

javascript - 无法访问在 Angular 的另一种方法中以一种方法实例化的成员

html - 如何使一个 div 最初隐藏并在输入时加载?

javascript - 使用 ng-bind 将值附加到翻译 token

Angular 4 + Jasmine 单元测试 : Reasons why fixture. detectChanges() 可能无法在更改 @Input() 变量时工作

javascript - 是否可以清除 NGZone 中设置的所有间隔?

javascript - 如何在 Angular 中使用 zone.js?