Angular 2: valueChanges 後に FormControl バリデータを更新する 質問する

Angular 2: valueChanges 後に FormControl バリデータを更新する 質問する

ValidtorsFormControl オブジェクトを更新する方法はありますか? FormGroup1 つの Input が選択フィールドである場合、選択フィールドの値が変更されたときに、FormGroup 内の他の FormControl でバリデーターを変更したいと考えています。

subscribeToFormChanges()以下は、FormGroup コンポーネントからのメソッドです。

private appIdRegexes = {
    ios: /^[a-zA-Z][a-zA-Z0-9]*(\.[a-zA-Z0-9\-]+){2,}$/,
    android: /^([a-zA-Z])[a-zA-Z0-9_]*(\.[a-zA-Z][a-zA-Z0-9\-]*){2,}$/,
    any: /^any$/
  };

private subscribeToFormChanges(): void {
    const myFormValueChanges$ = this.appsForm.valueChanges;
    myFormValueChanges$.subscribe(x => {
      const platform = this.appsForm.controls['platform'].value;
      const appId = this.appsForm.controls['appId'].value;

      if (this.appIdRegexes[platform]) {
        this.appsForm.controls['appId'] = new FormControl(appId, Validators.pattern(this.appIdRegexes[platform].source));
      }
    });
  }

HTML テンプレートは次のとおりです。

<div class="row" [formGroup]="appsForm">
  <div class="form-group col-xs-6">
    <label>Platform</label>

    <select id="licensePlatform" class="form-control"
            formControlName="platform">
      <option *ngFor="let platform of licensePlatforms" [value]="platform">
        {{platform}}
      </option>
    </select>

    <small [hidden]="appsForm.controls.platform.valid">
      Platform is required
    </small>
  </div>

  <div class="form-goup col-xs-6">
    <label>App ID</label>
    <input type="text" class="form-control" formControlName="appId">
    <small [hidden]="appsForm.controls.appId.valid">
      Please use the right ID format
    </small>
  </div>
</div>

ここで示すようなメソッドを実装するとsubscribeToFormChanges()appsForm.controls.appId.value入力フィールドに書き込んでも更新されなくなります。最初は値が更新されています。

ベストアンサー1

valueChangesプラットフォーム選択フィールドをリッスンし、setValidators()appId 入力フィールドでメソッドを使用することで問題を解決しました。この記事非常に役に立ちました。

これが私の解決策です:

 private subscribePlatformChanges() {
    const platformCtrl = this.appsForm.controls['platform'];
    const changes$ = platformCtrl.valueChanges;

    changes$.subscribe(platform => {
      this.appsForm.controls['appId'].setValidators([Validators.pattern(this.appIdRegexes[platform].source),
                                                    Validators.required]);
      this.appsForm.controls['appId'].updateValueAndValidity();
    });
  }

おすすめ記事