收听Angular2 / Typescript中对象字段的更改

前端之家收集整理的这篇文章主要介绍了收听Angular2 / Typescript中对象字段的更改前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在Angular2 / Typescript中,是否可以“观察”对象的字段以进行更改.

例如,假设我有一个Person类,其字段为firstName,lastName和fullName.是否可以在firstName或lastName更改时自动更新fullName?

像这样的东西:

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}`;
  }
}
第一种方法

您可以使用如下所述的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;
}

这样设置lastName或firstName时,fullName会自动更新:

var p = new Person();
p.lastName = 'last';
p.firstName = 'first';
console.log(p.fullName); // print 'first last'

第二种方法

默认情况下,Angular2不允许定义对象内属性的更改.它仅检测引用的更新.我的意思是如果更新绑定属性的引用(或基本类型的值).

那个说法,Angular2允许使用ngDoCheck钩子方法插入你自己的策略.

在其中,您可以利用KeyValueDiffers类(要注入)来检测特定对象中的更新.

有关详细信息,请参阅此链接

> https://angular.io/docs/ts/latest/api/core/DoCheck-interface.html

这是一个示例:

@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;
        }
      });
    }
  }
}

更新prop1属性的值时,将调用doSomethingIfProp1Change方法.

见plunkr:http://plnkr.co/edit/uvOKMXQa9Ik8EiIhb60Y?p=preview.

猜你在找的Angularjs相关文章