如果对象的属性值与上一张CD相同,如何在运行时分离变更检测OnPush?

问题描述

我有父级和子级组件。子组件中的更改检测策略为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 (将#修改为@)