Javascript 当更改检测处于推送状态时,为什么属性更改仍然会导致@Input在ngDoCheck中更改?
想想这个Javascript 当更改检测处于推送状态时,为什么属性更改仍然会导致@Input在ngDoCheck中更改?,javascript,angular,typescript,angular2-changedetection,Javascript,Angular,Typescript,Angular2 Changedetection,想想这个 @组件({ changeDetection:ChangeDetectionStrategy.OnPush, 选择器:“my-app-n1”, 模板:` {{from1.name} `, }) 导出类App2{ @输入()来自1; ngDoCheck(){ log('do check 1',this.from1); } ngOnChanges(更改:任何){ console.log('n1 change',changes); } 变更1(){ this.from1={'name':'
@组件({
changeDetection:ChangeDetectionStrategy.OnPush,
选择器:“my-app-n1”,
模板:`
{{from1.name}
`,
})
导出类App2{
@输入()来自1;
ngDoCheck(){
log('do check 1',this.from1);
}
ngOnChanges(更改:任何){
console.log('n1 change',changes);
}
变更1(){
this.from1={'name':'name1-2'}
}
}
@组成部分({
选择器:“我的应用程序”,
模板:`
`,
})
导出类应用程序{
发件人:任何;
构造函数(){
this.from={'name':'name0'}
}
ngOnChanges(更改:任何){
console.log('n0 change',changes);
}
更改0(){
this.from.name='name-0-2-2'
}
}
请注意,App2
使用ChangeDetectionStrategy.OnPush
单击changen0
时,我希望ngochanges
不会被调用(因为没有分配新的引用),并且ngDoCheck
会被调用this.from1
以获得数据{'name':'name0'}
,视图仍显示name0
而是
ngDoCheck
通过this调用。from1
equal{'name':'name-0-2-2'}
视图显示的是name0
我的问题如下
this.from1
发生了更改您正在为
App2
使用ChangeDetectionStrategy.OnPush
,这意味着除非更新输入绑定[from1]=“from”
,否则不会为App2
触发CD
因此,当您在此处更新name
属性时,name
将被更新:
changen0() {
this.from.name = 'name-0-2-2'
}
您不更新对this.from的引用,因此不会为App2触发更改检测,因此您不会在HTML中看到更改<代码>ngOnChanges
也不会被调用
ngDoCheck是用这个调用的。from1等于{'name':'name-0-2-2'}
ngDoCheck
并不意味着要检查您的组件。当Angular检查父组件时调用它。有关更多信息,请阅读本文:
这与中的原因相同,在测试OnPush时不要使用本机DOM事件,最好使用setTimeout
来模拟一个更改。尽管稍有不同,因为在这种情况下视图不会更改,差异的原因是什么?我发布了我的答案。如果这个或其他答案中有不清楚的地方,请告诉我。
changen0() {
this.from.name = 'name-0-2-2'
}