我想知道使用其中一种比另一种有什么优点或缺点:
constructor(private app:ApplicationRef, private ref:ChangeDetectorRef) {
this.ref.markForCheck();
// OR
this.ref.detectChanges()
// will do same thing?
...
vs
zone.run
(() => doSomething())
...
vs
app.tick();
它们本质上都会标记组件以进行检查和更新/重绘 UI。
I know app.tick()
将为整个应用程序执行此操作,但在我的测试中,它实际上并没有强制 UI 更新。
zone.run
and markforCheck
两者都强制 UI 在下一个区域循环检查时更新,那么为什么要使用其中一个而不是另一个呢?
如果您运行的代码仅影响当前组件,例如
someServiceThatRunsOutsideZone.getData()
.subscribe(data => {
this.data = data;
this.ref.markForCheck();
});
this.ref.markForCheck()
就很好了。
例如,如果你这样做this.router.navigateXxx(...)
在角度区域之外,那么很难知道是否this.ref.markForCheck()
将涵盖可能通过这个相当复杂的操作改变其状态的所有元素。
Also if this.router.navigateXxx(...)
调用一些异步调用,你的markForCheck
将在这些异步调用完成之前运行,并且不会在最后调用更改检测,因为这可能是必要的。
With
this.zone.run(() => this.router.navigateXxx(...))
没关系,因为this.router.navigateXxx()
并且该调用调用的所有代码(同步和异步)都将在 Angulars 区域内运行并使用其修补的 API。
我不知道之间的确切区别app.tick
and markForCheck
but app.tick
也确实有上面解释的缺点markForCheck
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)