Fuz*_*ley 6 observable typescript angular
在Angular2/Typescript中,是否可以"观察"对象的字段以进行更改.
例如,假设我有一个类Person
与领域firstName
,lastName
和fullName
.是否有可能自动更新fullName
每当要么firstName
或lastName
改变?
像这样的东西:
export class Person {
firstName: string= '';
lastName: string = '';
fullName: string = '';
constructor(firstName: string, lastName: string) {
this.firstName.onChange(() => { this.updateFullName(); });
this.lastName.onChange(() => { this.updateFullName(); });
this.firstName = firstName;
this.lastName = lastName;
}
updateFullName() {
this.fullName = `${this.firstName} ${this.lastName}`;
}
}
Run Code Online (Sandbox Code Playgroud)
第一种方法
您可以使用如下所述的TypeScript setter/getter来将fullName与firstName和lastName同步:
get lastName() {
return this._lastName;
}
set lastName(lastName:string) {
this._lastName = lastName;
this.fullName = this._firstName + ' ' + this._lastName;
}
get firstName() {
return this._firstName;
}
set firstName(firstName:string) {
this._firstName = firstName;
this.fullName = this._firstName + ' ' + this._lastName;
}
Run Code Online (Sandbox Code Playgroud)
这样设置lastName或firstName时,fullName会自动更新:
var p = new Person();
p.lastName = 'last';
p.firstName = 'first';
console.log(p.fullName); // print 'first last'
Run Code Online (Sandbox Code Playgroud)
第二种方法
默认情况下,Angular2不允许定义对象内属性的更改.它仅检测引用的更新.我的意思是如果更新绑定属性的引用(或基本类型的值).
那个说法,Angular2允许使用ngDoCheck钩子方法插入你自己的策略.
在其中,您可以利用KeyValueDiffers类(要注入)来检测特定对象中的更新.
有关详细信息,请参阅此链接:
这是一个示例:
@Component({
selector: 'my-component',
(...)
})
export class MyComponent implements DoCheck {
@Input() person: Person;
differ: any;
constructor(differs: KeyValueDiffers) {
this.differ = differs.find([]).create(null);
}
ngDoCheck() {
var changes = this.differ.diff(this.person);
if (changes) {
changes.forEachChangedItem((elt) => {
if (elt.key === 'firstName' || elt.key === 'lastName' ) {
this.person.fullName = this.person.firstName + ' ' + this.person.lastName;
}
});
}
}
}
Run Code Online (Sandbox Code Playgroud)
prop1
更新属性的值时,将doSomethingIfProp1Change
调用该方法.
请参阅此plunkr:http://plnkr.co/edit/uvOKMXQa9Ik8EiIhb60Y?p = preview .
归档时间: |
|
查看次数: |
8166 次 |
最近记录: |