web-dev-qa-db-ja.com

Angular2:条件付きで必要な検証

特定のフィールドで条件付きの必須検証を作成しようとしています。関数にValidators.requiredを返すことでこれを実行しようとしていますが、これは機能しないようです。どうすればこれを行うことができますか?これが私のコードです:

private _ansat: AbstractControl = new FormControl('', Validators.required);
private _helbred: AbstractControl = new FormControl('', Validators.compose([this.useValidateIfRadio(this._ansat, 0, Validators.required)]) );


constructor(private _fb: FormBuilder) {
    this.myForm = this._fb.group({
            ansat: this._ansat,
            helbred: this._helbred
        });
}

useValidateIfRadio (c: AbstractControl, n: number, v) {
        return function (control) {
            return new Promise(resolve => {
             // this.msg = ansatControl.value;
             console.log(v);
                if (c.value === n) {

                    resolve(v);
                }
                else {
                  resolve(null);

                }
            });
        };
    };

どんな助けでも大歓迎です。

9
Vanquiza

同様の問題がありましたが、答えが見つかりませんでした。まだ誰もこれに答えていないので、私が問題をどのように解決したか、そして同じ解決策を使用して問題を解決する方法の例を示します。

例:(電話番号はメールが設定されていない場合にのみ必要です)

export class UserComponent implements OnInit {

userForm: FormGroup;

constructor(private fb: FormBuilder) {}

ngOnInit() {

    //Create my userForm and and add initial validators
    this.userForm = this.fb.group({
        username: [null, [Validators.required]],
        name: [null, [Validators.required]],
        email: [],
        phoneNumber: [null, [Validators.required, Validators.minLength(4)],
    });

    //Listen to email value and update validators of phoneNumber accordingly
    this.userForm.get('email').valueChanges.subscribe(data => this.onEmailValueChanged(data));
}


onEmailValueChanged(value: any){
    let phoneNumberControl = this.userForm.get('phoneNumber');

    // Using setValidators to add and remove validators. No better support for adding and removing validators to controller atm.
    // See issue: https://github.com/angular/angular/issues/10567
    if(!value){
        phoneNumberControl.setValidators([Validators.required, Validators.minLength(4)]);
    }else {
        phoneNumberControl.setValidators([Validators.minLength(4)]);
    }

    phoneNumberControl.updateValueAndValidity(); //Need to call this to trigger a update
}

}

したがって、あなたの場合、changeListenerを私の電子メールリスナーと同じ「_ansat」に追加し、それに応じて「_helbred」にrequiredを追加する必要があります。

29
Erex

フィールドのバリデーターを追加するだけです。

if(some_logic) {
 this.your_form.get('field_name').setValidators([Validators.required]);
}
4
Laurynas

これらの答えはほとんど私をそこに導きました、しかし私はかなり大きな落とし穴を見つけました…場合によっては、setValidatorsはバリデーターの既存の配列に追加するだけで、それらをクリアするためにうまく機能しません。場合によっては、ngOnInitが2回続けてロードされるときのように、条件は最初に負になり、次に依存している渡された値に対して正になることがあります。このような場合、必須に設定し、後でクリアを試みますが、UIは引き続き期待どおりに動作します。これを修正するには、次のことを考慮してください...

const myControl = this.your_form.get('field_name');
if(some_logic) {
     myControl.clearAsyncValidators();
     myControl.clearValidators();
     myControl.updateValueAndValidity({onlySelf:true});
} else {
     myControl.setValidators([Validators.required, Validators.other…]);
}
0
AppDreamer