Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当更改检测处于推送状态时,为什么属性更改仍然会导致@Input在ngDoCheck中更改?_Javascript_Angular_Typescript_Angular2 Changedetection - Fatal编程技术网

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'
    }