gpt4 book ai didi

angular - 为什么 Angular 异步管道使用 cdr.markForCheck() 而不是 cdr.detectChanges()?

转载 作者:行者123 更新时间:2023-12-03 23:43:19 25 4
gpt4 key购买 nike

我有一个一般的 Angular 问题:
为什么 Angular async管道使用cdr.markForCheck()而不是 cdr.detectChanges() ?
我看到这两种“风格”有两个主要区别:

  • markForCheck()标记要检查到根组件的路径 - 更新什么
  • markForCheck()让变更检测发生在当前或下一个周期 - 计时

  • 我的想法或问题:
  • 为什么我们需要检查到根的整个路径(在 async 管道中)?为什么不只是当前组件? ( detectChanges() ) - 这与 有关更新什么
  • 为什么只标记(对于当前/下一个周期 - 在 markForCheck() 中使用 ngZone)?为什么不立即检测变化? ( detectChanges() ) 这与 有关计时
  • 如果没有 ngZone 异步触发器/没有异步操作怎么办?那么 View 更新不会发生?
  • 如果我们改变会发生什么 async管道使用 detectChanges()反而?

  • async pipe :
      private _updateLatestValue(async: any, value: Object): void {
    if (async === this._obj) {
    this._latestValue = value;
    this._ref.markForCheck();
    }
    }
    编辑:
    请不要解释每种方法的作用,因为我在文档中阅读了很多次,而且我无法理解 async观点看法。
    我要知道的重要部分是为什么关于 更新什么 计时 .

    最佳答案

    有关正确的文档检查 ChangeDetectorRef
    检测变化

    Checks this view and its children


    如果您的类已更改但 View 尚未更新,则需要通知 Angular 检测这些更改。
    标记检查

    When a view uses the OnPush (checkOnce) change detection strategy, explicitly marks the view as changed so that it can be checked again.


    仅从文字中就可以看出,该策略用于组件检测策略已更改为 onPush 的情况。 (例如,如果 @Input() 已更改)。
    更新
    直接回答您的问题:

  • why do we need to check whole path to the root (in async pipe)? Why not just current component? (detectChanges()) - this relates to what to update



  • 它不检查根,而是检查组件的祖先
    enter image description here

  • why just mark only (for current/next cycle - in markForCheck() using ngZone)? Why not detect changes immedially? (detectChanges()) this relates to timing



  • 我认为这是一个与性能相关的主题。收集所有需要运行的检查并在下一个循环中执行它们。

  • what if there is no ngZone async trigger / no async operation? Then the view update won't happen?



  • 正确,如果不会通知 Angular,则 View 中不会发生任何变化

  • what would happen if we changed async pipe to use detectChanges() instead?



  • 我想它也可以工作,但它不仅会检查更改,还会直接执行 View 的更新。

    关于angular - 为什么 Angular 异步管道使用 cdr.markForCheck() 而不是 cdr.detectChanges()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64423407/

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