2017-07-26 2 views
2

を削除する:2角度 - 私はこの方法(フォームがFormGroupを使用して構築されている)を使用して、特定のオプションが選択された場合は、入力の検証ルールを更新する機能を書いた検証エラー

onValueChanged(data : any) { 
    let appVIP1 = this.vip1TabForm.get('option1'); 
    let appVIP2 = this.vip2TabForm.get('option2'); 
    let appVIP3 = this.vip3TabForm.get('option3'); 

    //Set required validation if data is 'option3' 
    if(data != 'option3') { 
     //Due to initialization errors in UI, need to start with the case 
     //That there are validations, check to remove them 
     appVIP1.setValidators([]); 
     appVIP2.setValidators([]); 
     appVIP3.setValidators([]); 
    } 
    else { 
     appVIP1.setValidators([Validators.required]); 
     appVIP2.setValidators([Validators.required]); 
     appVIP3.setValidators([Validators.required]); 
    } 
}  

を私はバインドラジオボタン(私は最初にthis answerからのガイドを使用しましたが、onChange関数が正しくバインドされていませんでした)でクリックイベントを呼び出します。

これはうまくいきます。ユーザーがオプション1または2を選択すると、検証は空で、トリガーされません。オプション3を選択すると、検証が表示され、送信が停止されます。しかし、私はユーザーが提出し、エラーを見て、オプション1または2に変更する問題にぶつかります。バリデータがクリアされている間も、私のフォームは無効として読み込まれます。私は検証している複数の入力フィールドを持っているので、バリデータがこのように削除された場合、フォームを有効にするだけでは設定できません。これをどうやってやりますか?フォームグループの特定のフィールドのhas-errorを削除できますか?

答えて

3

正しいバリデータが所定の位置にある場合、それらはオプションを選択した後、あなたがmanually call AbstractControl#updateValueAndValidityことができます。

this.formBuilder.updateValueAndValidity(); 

(。もちろん、this.formBuilderがあなたのFormBuilderインスタンスである場合は、)

をあなたはまた、それを呼び出すことができますFormElements上で直接実行できます。

これは、フォーム要素の値がプログラムによって変更された後で検証をトリガするためによく使用されます。

+0

...私はこのリンクにも...私はこの質問をしていないふりをしました:)。私はそれをテストし、それが働く(私はそれが確信している)ときにあなたの答えとしてこの質問を更新します。 – user3334871

+1

@ user3334871問題はありませんが、角度は巨大なフレームワークであり、すべてを把握するまでに時間がかかります。これは最近の(非常に似通った)アプリケーションで_heavy_を使用する必要があったため、これが気になりました。好奇心から、FormBuilder全体ではなく 'FormGroup'(試したことはない、今はできない)で試してみてください。それがうまくいくかどうかは不思議です。 – msanford

+1

確かに!ビルドとデプロイ後に私の結果を1秒後に投稿します。 – user3334871

関連する問題