在AngularJS中,你可以使用$scope的$watch函数指定观察者来观察作用域变量的变化。在Angular中,什么与监视变量变化(比如组件变量)是等价的?


当前回答

下面是为模型使用getter和setter函数的另一种方法。

@Component({
  selector: 'input-language',
  template: `
  …
  <input 
    type="text" 
    placeholder="Language" 
    [(ngModel)]="query" 
  />
  `,
})
export class InputLanguageComponent {

  set query(value) {
    this._query = value;
    console.log('query set to :', value)
  }

  get query() {
    return this._query;
  }
}

其他回答

你可以使用getter函数或get访问器来充当angular 2上的watch。

请看这里的演示。

import {Component} from 'angular2/core';

@Component({
  // Declare the tag name in index.html to where the component attaches
  selector: 'hello-world',

  // Location of the template for this component
  template: `
  <button (click)="OnPushArray1()">Push 1</button>
  <div>
    I'm array 1 {{ array1 | json }}
  </div>
  <button (click)="OnPushArray2()">Push 2</button>
  <div>
    I'm array 2 {{ array2 | json }}
  </div>
  I'm concatenated {{ concatenatedArray | json }}
  <div>
    I'm length of two arrays {{ arrayLength | json }}
  </div>`
})
export class HelloWorld {
    array1: any[] = [];
    array2: any[] = [];

    get concatenatedArray(): any[] {
      return this.array1.concat(this.array2);
    }

    get arrayLength(): number {
      return this.concatenatedArray.length;
    }

    OnPushArray1() {
        this.array1.push(this.array1.length);
    }

    OnPushArray2() {
        this.array2.push(this.array2.length);
    }
}

下面是为模型使用getter和setter函数的另一种方法。

@Component({
  selector: 'input-language',
  template: `
  …
  <input 
    type="text" 
    placeholder="Language" 
    [(ngModel)]="query" 
  />
  `,
})
export class InputLanguageComponent {

  set query(value) {
    this._query = value;
    console.log('query set to :', value)
  }

  get query() {
    return this._query;
  }
}

如果你想让它双向绑定,你可以使用[(yourVar)],但你必须实现yourVarChange事件,并在每次变量改变时调用它。

像这样的东西来跟踪英雄的变化

@Output() heroChange = new EventEmitter();

然后当你的英雄发生变化时,调用this.heroChange.emit(this.hero);

[(英雄)]绑定将为您完成其余的工作

请看例子:

http://plnkr.co/edit/efOGIJ0POh1XQeRZctSx?p=preview

这个行为现在是组件生命周期的一部分。

组件可以在OnChanges接口中实现ngOnChanges方法来访问输入更改。

例子:

import {Component, Input, OnChanges} from 'angular2/core';


@Component({
  selector: 'hero-comp',
  templateUrl: 'app/components/hero-comp/hero-comp.html',
  styleUrls: ['app/components/hero-comp/hero-comp.css'],
  providers: [],
  directives: [],

  pipes: [],
  inputs:['hero', 'real']
})
export class HeroComp implements OnChanges{
  @Input() hero:Hero;
  @Input() real:string;
  constructor() {
  }
  ngOnChanges(changes) {
      console.log(changes);
  }
}

如果除自动双向绑定外,还希望在值更改时调用函数,则可以将双向绑定快捷语法转换为更详细的版本。

<input [(ngModel)]=“yourVar”></input>

是简写

<input [ngModel]=“yourVar” (ngModelChange)=“yourVar=$event”></input>

(参见http://victorsavkin.com/post/119943127151/angular-2-template-syntax)

你可以这样做:

<input [(ngModel)]=“yourVar” (ngModelChange)=“changedExtraHandler($event)”></input>