li
アイテムをクリックするとモデルを設定するカスタム選択コンポーネントがありますが、モデルを変更するたびに手動でthis.modelChange.next(this.model)
を呼び出すので、避けたいと思うものはかなり乱雑です。角度2でモデルが変化するたびに関数を呼び出す方法は?
$scope.$watch
のようなものがあり、値が変わるのを見て、それが起こるたびにthis.modelChange.next(this.model)
を呼び出すのが私の質問です。
私はObservables
について読んできましたが、私が見ているすべての例は外部APIへの非同期要求であるため、単純な値としてどのように使用されるのか分かりません。
確かにこれを達成するためのより簡単な方法が必要ですか?
(これは実際には入力を使用していないため、ngModelChanges
は使用できません)。
import {Component, Input, Output, EventEmitter, OnInit, OnChanges} from 'angular2/core';
@Component({
selector: 'form-select',
templateUrl: './app/assets/scripts/modules/form-controls/form-select/form-select.component.html',
styleUrls: ['./app/assets/scripts/modules/form-controls/form-select/form-select.component.css'],
inputs: [
'options',
'callback',
'model',
'label'
]
})
export class FormSelectComponent implements OnInit, OnChanges {
@Input() model: any;
@Output() modelChange: EventEmitter = new EventEmitter();
public isOpen: boolean = false;
ngOnInit() {
if (!this.model) {
this.model = {};
}
for (var option of this.options) {
if (option.model == (this.model.model || this.model)) {
this.model = option;
}
}
}
ngOnChanges(changes: {[model: any]: SimpleChange}) {
console.log(changes);
this.modelChange.next(changes['model'].currentValue);
}
toggle() {
this.isOpen = !this.isOpen;
}
close() {
this.isOpen = false;
}
select(option, callback) {
this.model = option;
this.close();
callback ? callback() : false;
}
isSelected(option) {
return option.model === this.model.model;
}
}
編集:私は(上記の更新されたコードを参照)ngOnChanges
を使用してみましたが、それは唯一の初期化時に一度実行されます、それは変更を検出しません。何か間違っていますか?あなたはmodel
ゲッター/セッターを作るか@Input()
値が変更された後たびに呼び出されngOnChanges(changes) {}
メソッドを追加することにより、OnChangesを実装することができますいずれか
Set/getはうまくいきません。エラーが多発します。ngOnChangesはコンポーネント内の値を変更してから2つの方法で親コンポーネントにバインドするため動作しません。 ngDoCheck()は、変更されたかどうかを知る必要があるだけであり、内部に特定のロジックは必要ありません。私が本当に好きなのはオブザーバーを使うことですが、私はそれを実装する方法を忘れています。オブザーバーでこれを達成する方法を教えてください。私のコードを使用して、私のユースケースとは全く異なるいくつかのランダムな例ではありません。私は怒っているように感謝します。 – Chrillewoodz
ngDoCheck()に関して、Angularは私たちのReferenceTypesの構造を魔法のように知ることができないので、独自の変更検出ロジックを記述する必要がある場合は余計ではありません。 (これは、私が参照しているライフサイクルのドキュメントで議論されています。) 'model'は入力プロパティなので、observableではなくngDoCheck()を使います。あなたは、単に動作していない作品を示す単純なプランカーを持っていますか? –
"モデルは入力プロパティなので、オブザーバブルの代わりにngDoCheck()を使用します。"どうしてこれなの? http要求以外にobservablesを正確に使うべきでしょうか?以前のモデルと照合してdoCheckを使って作業したり、無限ループになったりしました。 – Chrillewoodz