Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.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
Angular 角度2+;如果使用双向数据绑定,则在更改时不执行设置功能代码_Angular_Typescript_Data Binding - Fatal编程技术网

Angular 角度2+;如果使用双向数据绑定,则在更改时不执行设置功能代码

Angular 角度2+;如果使用双向数据绑定,则在更改时不执行设置功能代码,angular,typescript,data-binding,Angular,Typescript,Data Binding,我试图在两个组件之间共享一个对象。父组件具有该对象的全局实例。两个子组件通过双向数据绑定获得该实例。但是,当该实例发生更改时,尽管会传播更改,但不会执行与该字段关联的set函数 @Output() consultChanged = new EventEmitter<Consult>(); @Input() set consult(consult: Consult) { console.log("Code to execute on change"); this

我试图在两个组件之间共享一个对象。父组件具有该对象的全局实例。两个子组件通过双向数据绑定获得该实例。但是,当该实例发生更改时,尽管会传播更改,但不会执行与该字段关联的set函数

@Output() consultChanged = new EventEmitter<Consult>();
  @Input()
  set consult(consult: Consult) {
    console.log("Code to execute on change");
    this._consult = consult;
    this.consultChanged.emit(this._consult);
  }
@Output()consultChanged=neweventemitter();
@输入()
设置咨询(咨询:咨询){
log(“更改时执行的代码”);
这个._consult=consult;
this.consultChanged.emit(this.\u consult);
}
以下是中的一个示例,其中不执行console.log

编辑:我正在寻找的行为是在变量更改时调用共享该变量的所有组件的setter(用该变量的新值刷新其他变量)。如果你们知道如何做不同的,我也想听听

但是,当该实例发生更改时,尽管会传播更改,但不会执行与该字段关联的set函数

这是因为在适当的位置修改对象时不会调用setter。这并不特定于Typescript或Angular,而是setter在Javascript中的工作方式

如果要确保调用setter,需要将数据视为不可变的。所以不是

this.consult.property = "new value";
你应该使用

this.consult = {...this.consult, property: "new value"};
现在将调用setter,因为引用本身已更改

但是,当该实例发生更改时,尽管会传播更改,但不会执行与该字段关联的set函数

这是因为在适当的位置修改对象时不会调用setter。这并不特定于Typescript或Angular,而是setter在Javascript中的工作方式

如果要确保调用setter,需要将数据视为不可变的。所以不是

this.consult.property = "new value";
你应该使用

this.consult = {...this.consult, property: "new value"};

现在将调用setter,因为引用本身已更改。

您希望发生什么?每次单击都会将另一个“C”推送到数组中,此列表显示在您的组件中。这就是当前代码所做的,并且它是有效的。您的目标是什么?您是否实现了ngOnChanges以对输入的更改作出反应?@Marlaqk这在这里没有帮助,因为更改检测不会捕获数据的突变。您希望发生什么?每次单击都会将另一个“C”推送到数组中,此列表显示在您的组件中。这就是当前代码所做的,并且它是有效的。你的目标是什么?你是否实现了ngOnChanges以对输入的变化做出反应?@Marlaqk这在这里没有帮助,因为变化检测不会捕捉数据的突变。我刚刚尝试过,我明白了你的意思。现在,在我单击的组件上正确地调用了setter,并且该组件上的属性也发生了更改。但是,这会破坏双向绑定,因为更改不会传播回其父级。我刚刚编辑了这个问题,其中包含了有关我正在寻找的行为的更多信息。要使双向绑定起作用,输入x的输出必须命名为xChange,而不是xChange。就是这样。谢谢,我都没注意到!另一方面,如果您想在多个组件之间共享同一个变量,最好将此状态放入服务中,而不是到处传递。但这取决于用例。我刚刚试过,我明白你说的。现在,在我单击的组件上正确地调用了setter,并且该组件上的属性也发生了更改。但是,这会破坏双向绑定,因为更改不会传播回其父级。我刚刚编辑了这个问题,其中包含了有关我正在寻找的行为的更多信息。要使双向绑定起作用,输入x的输出必须命名为xChange,而不是xChange。就是这样。谢谢,我都没注意到!另一方面,如果您想在多个组件之间共享同一个变量,最好将此状态放入服务中,而不是到处传递。但这取决于用例。