更改检测问题 - 为什么当它与On Push相同的对象引用时会发生变化

时间:2017-02-18 06:49:09

标签: angular

我认为在讨论之后我非常清楚Angular Change检测是如何工作的:Why is change detection not happening here when [value] changed?

但请看一下这句话:https://plnkr.co/edit/jb2k7U3TfV7qX2x1fV4X?p=preview

[1, 2] > 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '>' not supported between instances of 'list' and 'int'

点击a,它改为c

据我所知,click事件触发了应用程序级别的更改检测,但[myData] =“testData”仍然引用同一个对象,我使用On Push on Simple,为什么会更改?

1 个答案:

答案 0 :(得分:13)

这是设计的。

如果您的组件具有OnPush更改检测,那么除非发生以下四种情况之一,否则不会触发其detectChangesInternal功能:

1)其中一个@Inputs更改

<强>〜2.4.x的 enter image description here

<强>〜4.x.x enter image description here

注意: @Input应该在模板中显示。请参阅问题https://github.com/angular/angular/issues/20611comment

2)从组件触发绑定事件(是您的情况

警告:2.x.x和4

之间存在一些差异

Angular ChangeDetectionStrategy.OnPush with child component emitting an event

<强>〜2.4.x的 enter image description here

<强>〜4.x.x enter image description here

3)您手动标记要检查的组件(ChangeDetectorRef.markForCheck()

4)异步管道内部调用ChangeDetectorRef.markForCheck()

private _updateLatestValue(async: any, value: Object): void {
  if (async === this._obj) {
    this._latestValue = value;
    this._ref.markForCheck();
  }
}

https://github.com/angular/angular/blob/2.4.8/modules/%40angular/common/src/pipes/async_pipe.ts#L137

换句话说,如果您为组件设置了OnPush,那么在第一个检查组件的状态将从CheckOnce更改为Checked之后,之后它会被更改为onPush只要我们不改变状态就等着。它将发生在以上三个方面之一。

另见:

对angular2变化检测的工作方式也有很好的解释:

以下是 Live Example (感谢Paskal)解释Comp16更改检测。 ( dependencies { compile 'com.commit451:PhotoView:1.2.4' } 看起来像你的组件。你可以点击这个框。)