我想知道使用一个优于另一个的优势或劣势:
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。
我知道app.tick()
会为整个应用做到这一点,但在我的测试中,它并没有真正强制用户界面更新。
zone.run
和markforCheck
都强制用户界面在下一个区域周期检查时更新,那么为什么要使用其中一个呢?
答案 0 :(得分:1)
如果您运行仅影响当前组件的代码,例如
someServiceThatRunsOutsideZone.getData()
.subscribe(data => {
this.data = data;
this.ref.markForCheck();
});
this.ref.markForCheck()
就好了。
如果你在Angulars区域之外做例如this.router.navigateXxx(...)
那么很难知道this.ref.markForCheck()
是否会涵盖可能通过这个相当复杂的操作改变状态的所有元素。
此外,如果this.router.navigateXxx(...)
调用某些异步调用,则markForCheck
将在这些异步调用完成之前运行,并且不会在最后调用更改检测,因为它可能是必需的。
用
this.zone.run(() => this.router.navigateXxx(...))
没关系,因为this.router.navigateXxx()
并且该调用调用的所有代码(sync和async)都将在Angulars区域内运行并使用其修补的API。
我不知道app.tick
和markForCheck
之间的确切区别,但app.tick
也确实存在上述markForCheck