[解決済み] フォームコントロールのvalueChangesが前の値を与える
質問
フォームコントロールに名前
'question1'
という名前のフォームコントロールがあります。
parentForm
で、以下のように購読しています。
そのラジオボタンには2つのオプションがあります
Yes
と
No
を選択すると
No
を選択すると
Yes
を選択すると
Yes
を選択すると
No
.
this.parentForm.controls['question1'].valueChanges.subscribe(
(selectedValue) => {
// If option `No is selected`
console.log(selectedValue); // displays No. OK
console.log(this.parentForm.value['question1']); // displays Yes. Problem is here
}
);
selectedValue
変数は正しい値を持っていますが、もし私が
console.log(this.parentForm.value['question1']
を実行すると、前の値が表示されます。
を配置しようとしたのですが
setTimeout()
から値を取得する前に
this.parentForm.value['question1']
であれば、問題なく動作します。
setTimeout(() => {
console.log(this.parentForm.value['question1']); // gives the correct value.
}, 500);
しかし、私の疑問は、なぜ
parentForm
は、そのコントロールの値が変更されたときに更新されず、それも私は値が変更された後にのみ、その値を取得しています。
注意: 私は
parentForm.valueChanges
を観測したくないのですが、私の要件ではありません。
どのように解決するのですか?
valueChanges
はObservableなので、パイプで
pairwise
をパイプで接続して、サブスクリプションの前と次の値を取得することができます。
// No initial value. Will emit only after second character entered
this.form.get('fieldName')
.valueChanges
.pipe(pairwise())
.subscribe(([prev, next]: [any, any]) => ... );
// Fill buffer with initial value, and it will emit immediately on value change
this.form.get('fieldName')
.valueChanges
.pipe(startWith(null), pairwise())
.subscribe(([prev, next]: [any, any]) => ... );
StackBlitzで動作する例です。 https://stackblitz.com/edit/angular-reactive-forms-vhtxua
更新
もし、あなたが
startWith
が表示される。
非推奨
のように見えますが、そうではありません。 この演算子の有効なシグネチャは1つだけです。
回答
.
可能性が高いのは、startWith(null) または startWith(undefined) を使用していることで、これらは通知にもかかわらず非推奨ではありませんが、IDE は非推奨である間違った関数シグネチャを検出し、警告を表示します。
簡単な回避策は、期待される戻り値の型を提供することです。
// Prevent deprecation notice when using `startWith` since it has not been deprecated
this.form.get('fieldName')
.valueChanges
.pipe(startWith(null as string), pairwise())
.subscribe(([prev, next]: [any, any]) => ... );
StackBlitz で動作する例として
startWith
:
https://stackblitz.com/edit/angular-reactive-forms-rvxiua
関連
-
[解決済み】FormBuilderコントロールの値を手動で設定する。
-
[解決済み] Angular 2のFormGroupからすべての検証エラーを取得する
-
[解決済み] Angular2でNgForがPipeでデータを更新しない。
-
[解決済み] Angular CLIで特定のバージョンのAngularをインストールするには?
-
[解決済み] angular4 / typescriptでdocument.getElementByIdの置き換え?
-
[解決済み] Angular 2で入力タグのファイルタイプで選択されたファイルをリセットする方法は?
-
[解決済み] Angular2 formGroupに値を設定する
-
[解決済み] Angular : ルートへの手動リダイレクト
-
[解決済み] Uncaught Error: Unexpected module 'FormsModule' declared by the module 'AppModule'. Pipe/@Directive/@Component アノテーションを追加してください。
-
[解決済み] Angularアプリケーションに複数のHTTPインターセプターを追加する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] パイプ ' ' が見つかりません。
-
[解決済み] 角度2 ngfor 最初、最後、インデックスループ
-
[解決済み] タイプスクリプト タイプ X はタイプ Y の length、pop、push、concat、その他 26 のプロパティが欠落しています。[2740]
-
[解決済み] FormGroupから単一の値を取得する方法
-
[解決済み] 子ルートから親ルートに移動するにはどうしたらいいですか?
-
[解決済み] Uncaught Error: Unexpected module 'FormsModule' declared by the module 'AppModule'. Pipe/@Directive/@Component アノテーションを追加してください。
-
[解決済み] ng-forOf」は既知のネイティブプロパティではないため、バインドできない [重複] 。
-
[解決済み] APIレスポンスからレスポンスヘッダを読み取る - Angular 5 + TypeScript
-
[解決済み] Angular2で生のhtmlをバインドする方法 [重複]。
-
[解決済み] angular2でdata-*属性にバインドする方法は?重複