gpt4 book ai didi

angular - 在 angular2 中,使用 zone.run 与 changeDetecotor.markForCheck() 的优势

转载 作者:太空狗 更新时间:2023-10-29 19:31:10 27 4
gpt4 key购买 nike

我想知道使用一个相对于另一个的优势或劣势是什么:

 constructor(private app:ApplicationRef, private ref:ChangeDetectorRef) {
this.ref.markForCheck();
// OR
this.ref.detectChanges()
// will do same thing?
...

对比

zone.run

(() => doSomething())
...

对比

  app.tick();

它们基本上都会标记要检查和更新/重绘 UI 的组件。

我知道 app.tick() 会为整个应用执行此操作,但在我的测试中它实际上并没有强制更新 UI。

zone.runmarkforCheck 都强制 UI 在下一次区域循环检查时更新,那么为什么要使用一个而不是另一个呢?

最佳答案

如果你运行的代码只影响当前组件,比如

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() 和该调用调用的所有代码(同步和异步)将在 Angulars 区域内运行并使用其修补的 API。

我不知道 app.tickmarkForCheck 之间的确切区别,但是 app.tick 也有上面解释的缺点对于 markForCheck

关于angular - 在 angular2 中,使用 zone.run 与 changeDetecotor.markForCheck() 的优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37643607/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com