更新绑定对象的内容时不会触发 onChanges

Posted

技术标签:

【中文标题】更新绑定对象的内容时不会触发 onChanges【英文标题】:The onChanges isn't fired when updating the content of a bound object 【发布时间】:2019-01-28 21:08:50 【问题描述】:

我在组件中有父子关系。如果我在父组件中更新值绑定对象,那么它必须在子组件中通知。

子组件

export class childComponent implements OnChanges 
@Input() data =  name: "Datta" ;

ngOnChanges() 
  console.log('updated');

ParentComponent.html

<child-com [data]="localData"></child-com>
<button (click)="buttonClick()">changeData</button>

父组件

 export class ParentComponent  
localData: any;

buttonClick() 
  this.localData.name = "sagar";

如果我更改绑定对象的引用,那么它会反映,但如果我更新对象中的特定值,那么它不会反映。

【问题讨论】:

能分享一下父子组件和视图文件的完整代码吗? 【参考方案1】:

这是一个非常典型的 Angular 问题陈述。使用 Getter/Setter 进行属性绑定,可以在 setter 方法中检测到变化。

export class childComponent 

  data: any =  name: "Datta" ;

  get name(): any 
    return this.data;
  

  @Input("data")
  set name(name: any) 
    this.data = name;
  


如果可行,请告诉我。

【讨论】:

谢谢KunalMZ .....我的场景有点不同,我在一些过滤的基础上在子组件中显示值。所以我想要更新值后的事件。据我所知,当实际对象改变或者我们可以说引用改变时,会调用“set”函数。所以 getter 和 setter 在我的情况下不起作用。【参考方案2】:

在我看来,这条线需要改变。

@Input() data =  name: "Datta" ;

到这里:

  @Input() data;

因为在这里您正在更改对象的引用。

如果您需要在子组件中更改数据对象的名称,请在 ngOnInit 中调用它,如下所示:

ngOnInit() 
this.data.name = "Datta";

【讨论】:

【参考方案3】:

这就是 Angular 的变更检测的工作原理。如果对象引用没有改变,那么绑定的子组件将不会调用其onChanges 方法。您将需要更新参考。示例:

this.localData = 
  ...this.localData,
  name: "sagar",

【讨论】:

有没有其他方法可以在不更改引用的情况下获得子组件的更改? 没有。更改检测是有效的,因为它依赖于对象引用已更改或未更改的事实。它不需要遍历整个对象来查看某个属性是否发生了变化。

以上是关于更新绑定对象的内容时不会触发 onChanges的主要内容,如果未能解决你的问题,请参考以下文章

Ember 计算属性在绑定到深度嵌套的属性时不会触发

vue 关于数组和对象的更新

vue 关于数组和对象的更新

自动完成时触发的任何事件?

C# 事件不会为新对象触发

当我使用 RxDatasources 更新数据源时,不会触发 configureCell