【问题标题】:Angular does not fire change detection without updating object referenceAngular 在不更新对象引用的情况下不会触发更改检测
【发布时间】:2022-01-25 01:37:27
【问题描述】:

我有一个使用以下模型类的角度应用程序:

export interface Product {
  id: number;
  name: string;
  currentPrice: number;
  orders?: Order[];
  lastUpdate?: Date;
}

export interface Order {
  orderId: string;
  qty: number;
  amount: number;
}

当用户添加订单时,我想在 UI 上添加注释。但是,Angular 在不更新产品的对象引用的情况下不会触发更改检测。

复制于:https://stackblitz.com/edit/ag-grid-angular-use-gridoptions-k75cr8?file=src/app/order.component.ts

“添加订单”按钮不会添加“产品/订单在 hh:mm:sss 上更新”条目。 “添加订单和更改参考”按钮添加它的条目。

为什么我需要更新模型的参考来触发变化检测? (为什么在点击“添加订单”按钮时订单表仍然更新而没有触发更改检测)

【问题讨论】:

  • 谢谢。它回答了第一个问题,即为什么我需要更新模型的参考。看起来这就是 Angular 的工作原理!你知道为什么订单表仍然会更新而不触发更改检测吗?
  • 您没有启用更改检测,因此使用默认策略。此策略检查对象突变,这发生在addOrder
  • 我相信有两种策略 - Default 和 OnPush。 OnPush 策略会检测到这种变化吗?
  • No OnPush 不会检测到它。但是,在这种情况下,您可以在代码中手动调用 ChangeDetectionRef.detectChanges(),此时您希望 Angular 检测您的更新。

标签: angular typescript angular-changedetection


【解决方案1】:

当用户添加订单时,我想在 UI 上添加注释。但是,Angular 在不更新产品的对象引用的情况下不会触发更改检测。

在您的示例中,Angular 会在您单击“添加订单”按钮时运行更改检测,这就是 OrderComponent 中的表反映新添加的订单的原因。


“添加订单”按钮不会添加“产品/订单在 hh:mm:sss 上更新”条目。 “添加订单和更改参考”按钮添加它的条目。

“添加订单”按钮不会添加条目,因为未调用与产品关联的 @Input() 设置器。为什么不叫?因为 Angular 执行引用检查,并没有发现属性绑定有任何变化。所以它不会更新绑定。

在“添加订单和更改参考”的情况下,您正在更改参考,因此 Angular 将更新绑定,然后调用 @Input 设置器来更新 this.notes 值。


为什么我需要更新模型的参考来触发变化检测? (为什么在点击“添加订单”按钮时订单表仍然更新而没有触发更改检测)

使用DefaultChangeDetectionStrategy 时无需更新引用即可触发更改检测。为什么订单表会更新,是因为变更检测。

【讨论】:

    【解决方案2】:

    既然你得到了关于可以在不更新参考的情况下工作的参考问题的答案;

    您可以发送订单作为输入,并且可以在订单中保存orderedDate 信息。这是更新的堆栈闪电战;

    https://stackblitz.com/edit/ag-grid-angular-use-gridoptions-lmvcv4?file=src%2Fapp%2Forder.component.ts

    如果您仍想发送产品,您可以相应地更新输入,这也可以。

    【讨论】:

    • 感谢您的回复。但是,它没有回答为什么订单表仍然会在不触发更改检测的情况下更新。您能在回答中解释一下吗?
    • 据我所知,这只是参考。订单表查找订单参考,当订单更改时,该表将更新。这并不意味着如果 angular 没有检测到它,则不会更新参考。它就是这样做的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 2016-10-13
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多