[英]Intercepting @Input changes with getter and setter
我尝试使用@ Input
属性的Typescript访问器来拦截从父级到子级的更改。 我从文档中改变了一些这个例子。
我在父方法中设置了两个父属性更改,期望子项的绑定Input
属性将遵循。 我发现当在父项中更改属性时, setter
只触发一次:
this.name="John"; //but this.name = this.name + "r" will work
而对于这一个,它始终有效:
this.age++; // or this.age = this.age + 1;
要解决第一个问题,我需要在输出中使用EventEmitter“通知”父级(我已经尝试了,它可以工作),但是为什么第二个不需要呢? 有人可以解释两者之间的真正差异,以及为什么它不适用于第一个(或者为什么它适用于第二个)。
家长班: ......
name = 'Jane';
age = 10;
changeName(){
this.name= "John";
}
changeAge(){
this.age++;
}
家长观点:
<my-name [name]="name"></my-name>
<button (click)="changeName()">Click me to change the name</button>
<my-age [age]="age"></my-age>
<button (click)="changeAge()">Click me to change the age</button>
Child1班级:
private _name = '';
@Input()
set name(name: string) {
this._name = (name && name.trim()) || '<no name set>';
console.log(name);
}
get name(): string { return this._name; }
Child1查看:
My name is {{name}}.
Child2类: private _age = 0;
@Input()
set age(age: number) {
this._age = age || 0;
console.log(age);
}
get age(): number { return this._age; }
Child2视图
I am {{age}} years old
经过一些研究和反思,我发现/记得只有在有变化检测时才会更新绑定。 因此,如果name
属性设置如下:
this.name= "John";
第一次运行会更改属性的初始值,因此会触发访问者。 对于第二次和其他时间,相同的语句将不会触发更改检测,因为值没有更改(它已经是“John”),因此访问器将不会触发。
对于age
属性而言,它随着价值的增加而变化:
this.age++;
所以变更检测和访问器总是被触发。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.