问题描述
我有父级和子级组件。子组件中的更改检测策略为OnPush
。这意味着当我将对象从父组件发送到子组件( input() property )
时,该对象需要具有新的引用才能通过子组件更新状态。 / p>
例如:
APP组件HTML
<app-change-det [person]='person'></app-change-det>
<button (click)='change()'>Change the person name</button>
APP组件TS
person = {
name: 'John'
}
change() {
this.person = {...this.person};
this.person.name = 'some new name';
}
更改DET COMPOMENT(儿童)HTML
<p>{{ person.name }}</p>
{{ calledChildCompo() }}
更改DET COMPOMENT(儿童)TS
@Component({
selector: 'app-change-det',templateUrl: './change-det.component.html',styleUrls: ['./change-det.component.scss'],changeDetection: ChangeDetectionStrategy.OnPush
})
export class ChangeDetComponent {
@input() person;
constructor(private cd: ChangeDetectorRef) {};
ngOnChanges(changes: SimpleChanges): void {
}
calledChildCompo() {
console.log('child compo is called');
}
}
我正在使用-ChildChildCompo-函数,所以当控制台中出现一些日志时,我会知道我重新渲染了子组件并调用了更改的检测策略。
这里的问题是,现在每次我单击-change-函数时,都会将对象的name属性更改为一些新名称。我的问题是,我可以预防吗?因为每次此name属性的先前值和当前值都将相同,但是angular认为这是使用新引用更改整个对象(如果将来对name属性进行任何实际更改,则必须这样做)。>
因此,如果我在change
方法上单击一次应调用子组合,如果我再次单击并且name属性再次为some new name
则不应调用子组件,但如果是例如,mike
然后调用它,因为它的值不相同。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)