web-dev-qa-db-ja.com

formbuilderのpatchvalueまたはsetvalueは、フィールドをダーティまたはタッチ済みとしてマークしません

ユーザーがフォームを前後に移動するマルチステップフォームがあります。フォームデータをインサービスで保存し、彼が戻ってきたら、patchvalueを使用してすべてのデータをフォームにパッチします。 setvalueも試しましたが、フォームフィールドがダーティまたはタッチ済みとしてマークされていません。更新されたフィールドをダーティおよびタッチ済みとしてマークするにはどうすればよいですか?

this.formBuilder.pathValue(formData);
8
Hacker

この問題で私が見つけた唯一の解決策はそれです。

 this.form = this.formBuilder.group({
      id:[null],
      name: ValidatorsUtil.name(),
      lastName: ValidatorsUtil.required(),
      email: ValidatorsUtil.email(),
      phone: ValidatorsUtil.required(),      
    });

this.form.setValue(this.client, {emitEvent: true});

Object.keys(this.form.controls).forEach( controlKey => {
       this.form.controls[controlKey].markAsDirty();
     });
5

フォームオブジェクトに対してmarkAsDirty()markAsTouched()メソッドを使用して、フォームに明示的にマークを付けることができます。 API Here を参照してください

this.formName.markAsDirty()
this.formName.markAsTouched()

更新

Angular 8以降では、markAllAsTouchedを使用して、すべてのフォームフィールドをtouchedとしてマークできます。

this.formName.markAllAsTouched()
5
Pankaj Parkar