【发布时间】:2020-04-28 09:38:51
【问题描述】:
我正在使用 Angular 8。
我有一个带有 @Input() 属性的子组件。必须在绑定之前修改此输入,因此使用方法返回数据以进行绑定,如
<app-child [info]="getInfo()"></app-child>
而在父组件中,getInfo() 的返回值类似于
getInfo(): any|null {
console.log('called...');
if (this.data) {
return JSON.parse(this.data);
}
return null;
}
但是这样一来,每当子组件中发生某些事件时,就会一次又一次地调用该方法。
Stackblitz 示例:https://stackblitz.com/edit/angular-child-com
产生问题:
表单是从接受来自上述方法的输入的子组件呈现的。
单击任何按钮或输入字段,您可以从每个事件的方法调用中看到控制台日志打印字符串。
这会导致子组件中多次OnChange 事件触发。
【问题讨论】:
-
这是意料之中的。 Angular 不知道 getInfo() 可能返回什么。所以它在每次检测变化时调用它。而且您总是创建并返回一个新对象,因此它每次都绑定该新对象。一劳永逸地解析数据,将结果存储在一个字段中,然后将该字段作为输入传递。
-
Angular 的默认变更检测策略会在每个变更检测周期中检查所有
@Input绑定的属性。所以在绑定值到@Input属性时避免调用方法 -
您也可以使用
changeDetection: [onPush]并显式调用更改检测。
标签: angular angular-changedetection