我认为在讨论之后我非常清楚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,为什么会更改?
答案 0 :(得分:13)
这是设计的。
如果您的组件具有OnPush
更改检测,那么除非发生以下四种情况之一,否则不会触发其detectChangesInternal
功能:
@Inputs
更改 注意: @Input
应该在模板中显示。请参阅问题https://github.com/angular/angular/issues/20611和comment
警告:2.x.x和4
之间存在一些差异Angular ChangeDetectionStrategy.OnPush with child component emitting an event
ChangeDetectorRef.markForCheck()
)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'
}
看起来像你的组件。你可以点击这个框。)