【问题标题】:changeDetection onPush is triggering only on second clickchangeDetection onPush 仅在第二次点击时触发
【发布时间】:2020-07-03 14:31:16
【问题描述】:

我发现有关更改检测的性能存在一些问题,因此我从过去几周开始使用 onPush。到目前为止一切都很好,但我不知道它对 p-chips 的行为很奇怪,它只能在第二次点击时工作:(

Stackblitz 工作示例enter link description here

在 stackblitz 中,您可以使用 detectChanges 在第一次单击时看到名称更改,但这不是 p-chips 的情况...有人可以帮帮我吗:)

尝试使用 settimeout 只是为了检查它是否刷新了总视图,但 settimeout 也没有更新视图

【问题讨论】:

  • 实际上,您甚至不需要显式调用来检测更改,因为更改来自用户点击,由 onPush 自动处理!但仍然奇怪的是这些值没有反映在芯片中,因为如果您在模板中打印值,您确实会看到在您第一次按下按钮后它们确实被清空了..
  • 是的,不知道有什么问题。值也以这种方式被清空 - 单击一次按钮并在输入框内单击一次,值将被清除。

标签: javascript angular typescript angular2-changedetection


【解决方案1】:

您可以在emptyArray 函数中使用setTimeout(() => this._cdRef.detectChanges(), 0);。它使用区域并在它之后检测变化。

【讨论】:

    【解决方案2】:

    我相信这个question 的声明会有所帮助。

    我找不到使用 OnPush 检测策略发生这种情况的原因,但是将您的 detectChanges() 回调发送到队列中(使其异步)将解决您的问题。

    您可以通过在setTimeout 调用中调用方法来做到这一点:

    setTimeout(() => this._cdRef.detectChanges(), 0);
    

    请查看stackblitz demo

    【讨论】:

    • @GvsAkhil 你确定吗?我刚刚测试了他的代码,它可以工作!
    • 让我再试一次
    • 我添加了一个 stackblitz 链接,其中包含对答案的更改,您也可以在那里查看。
    • @CristianSarghe 但您知道为什么这里甚至需要变更检测吗?用户发起的事件不应该默认由 onPush 处理吗?
    • 我尝试了这个解决方案,它在 stackblitz 中工作,但在我的本地机器上却没有...... p-chips 可能真的很奇怪
    【解决方案3】:

    大家好,我尝试了你所有的答案,甚至 settimeout 都不适合我。我也不喜欢使用 settimeout,因为它确实会从应用组件级别更改检测

    这对我有用:)。我真的不明白为什么 detectChanges 对所有其他人都有效,而且只对这个 p 芯片我需要在它工作之前添加 markForCheck。

    this._cdRef.markForCheck();
    this._cdRef.detectChanges();
    

    【讨论】:

      猜你喜欢
      • 2021-03-14
      • 2018-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多