フォームグループには、いくつかのフォームコントロール値が他のフォームコントロール値に依存するフォームグループがあります。私の特定のケースでは、それらは相互に依存していますが、これは簡単のために以下の例には示されていません。FormGroup内の従属フォームコントロールの初期設定
ここにはplunkがあります。
const fetchedFormValues = {
timestamp: '1504116487374'
};
Observable.from(this.form.get('timestamp').valueChanges)
.filter(v => v)
.distinctUntilChanged()
.subscribe(timestamp => {
console.log('timestamp', timestamp);
this.form.get('date').setValue(new Date(timestamp).toISOString().substr(0, 10));
this.form.get('time').setValue(new Date(timestamp).toISOString().substr(11, 12))
});
this.form.reset(fetchedFormValues);
初期フォームの値は、バックエンドからフェッチされ(これは、後に行うことができる)reset
で設定されています。問題は、date
とtime
のsetValue
は、timestamp
が変更されたときに正常に機能しますが、リセット時は無視されます。
私はそれをできるだけ乾燥した状態に保ち、複数の場所でthis.form.get('date').setValue...
を避けるようにしています。これは既にリストされている観測で行われているためです。
なぜdate
とtime
フォームコントロールはtimestamp
のサブスクリプションの影響を受けませんreset
? setValue
で行われた変更を受け入れるようにreset
の動作を修正できますか?依存型コントロールを(相互に)扱う他の方法はありますか?
FormGroup.prototype.reset = function (value, options) {
if (value === void 0) { value = {}; }
if (options === void 0) { options = {}; }
this._forEachChild(function (control, name) {
control.reset(value[name], { onlySelf: true, emitEvent: options.emitEvent });
});
this.updateValueAndValidity(options);
this._updatePristine(options);
this._updateTouched(options);
};
あなたのケースでthis._forEachChild
ために、コントロールを返します:
おかげで、それを; sの偉大な説明を、効率的かつシンプルな。ここで秩序が重要であるとは決して考えられませんでした。オブジェクト小道具が順序付けられていないという事実を考慮して設計されているのだろうか?残念ながら、patchValueはresetと互換性がありません。これは私が試した最初のものでした(フォーム配列ではじめてです)。 – estus