実際には、子コンポーネントの入力がangular2 +で変化したときに検出して対処する方法が2つあります。
- 以前の回答でも述べたように、ngOnChanges()ライフサイクルメソッドを使用できます。
@Input() categoryId: string;
ngOnChanges(changes: SimpleChanges) {
this.doSomething(changes.categoryId.currentValue);
// You can also use categoryId.previousValue and
// categoryId.firstChange for comparing old and new values
}
ドキュメントのリンク:ngOnChanges、 SimpleChanges、 SimpleChangeの
例:このプランカーを見てください。
- または、次のように入力プロパティセッターを使用することもできます。
private _categoryId: string;
@Input() set categoryId(value: string) {
this._categoryId = value;
this.doSomething(this._categoryId);
}
get categoryId(): string {
return this._categoryId;
}
ドキュメントリンク:こちらをご覧ください。
デモ例:このプランカーを見てください。
どのアプローチを使用する必要がありますか?
コンポーネントに複数の入力がある場合、ngOnChanges()を使用すると、ngOnChanges()内ですべての入力のすべての変更を一度に取得できます。このアプローチを使用して、変更された入力の現在の値と以前の値を比較し、それに応じてアクションを実行することもできます。
ただし、特定の単一の入力のみが変更されたときに何かを実行したい場合(および他の入力を気にしない場合)、入力プロパティセッターを使用する方が簡単な場合があります。ただし、このアプローチは、変更された入力の以前の値と現在の値を比較する組み込みの方法を提供しません(これは、ngOnChangesライフサイクルメソッドで簡単に実行できます)。
2017-07-25を編集:いくつかの状況下では、角度変化の検出がうまくいかない場合があります
通常、データがJSプリミティブデータ型(string、number、boolean)である限り、setterとngOnChangesの両方の変更検出は、親コンポーネントが子に渡すデータを変更するたびに発生します。ただし、次のシナリオでは、起動せず、機能させるために追加のアクションを実行する必要があります。
ネストされたオブジェクトまたは配列(JSプリミティブデータ型の代わりに)を使用してデータを親から子に渡す場合、ユーザーによる回答(muetzerich)でも説明されているように、変更検出(setterまたはngchangesのいずれかを使用)が起動しない場合があります。解決策については、こちらをご覧ください。
Angularのコンテキスト外で(つまり、外部で)データを変更する場合、Angleは変更を認識しません。コンポーネントでChangeDetectorRefまたはNgZoneを使用して、外部の変更を角度で認識し、変更の検出をトリガーする必要がある場合があります。こちらをご覧ください。