1

FormBuilderでフォームを作成しています。ValidatorformGroupに追加します。私は条件付きで一定の条件上のアドレスのformControlsの一部にバリデータを追加したいAngular2:FormGroupのカスタムバリデータを作成する方法は?

this.myForm = fb.group({ 
     'name': ['', [Validators.maxLength(50), Validators.required]], 
     'surname': ['', [Validators.maxLength(50), Validators.required]], 
     'address': fb.group({ 
       'street': ['', Validators.maxLength(300)], 
       'place': [''], 
       'postalcode': [''] 
     }), 
     'phone': ['', [Validators.maxLength(25), phoneValidator]], 
     'email': ['', emailValidator] 
    }); 

: はここに私のコードです。

だから私は、次のようにvalidatorを追加しました:

 'address': fb.group({ 
       'street': ['', Validators.maxLength(300)], 
       'place': [''], 
       'postalcode': [''] 
     }), { validator: fullAddressValidator }) 

を、私はアドレスFormGroupのためのバリデータを作成するために始めた:私は、以下の条件を追加する必要が

export const fullAddressValidator = (control:FormGroup) => { 
    var street:FormControl = control.controls.street; 
    var place:FormControl = control.controls.place; 
    var postalcode:FormControl = control.controls.postalcode; 

    if (my conditions are ok) { 
     return null; 
    } else { 
     return { valid: false }; 
    } 
}; 

を:

  1. すべてのフィールドが空白の場合、フォームは有効です
  2. フィールドの一つが記入されている場合postalcodeが記入されている場合は、国(代わりに都市の)postalcode はオプションでのインスタンス
  3. その後zipValidatorがある必要がありますされ
  4. place場合、すべてのフィールドが必要とされなければなりません
    だからそのformControl

に追加し、一定の条件にFormGroupにAngular2 Validatorsを追加することが可能でしょうか? もしそうなら、条件をどのように実装するのですか?他のバリデータのソースコードにsetValidators()updateValueAndValidity()を使用できますか?

答えて

2

export const fullAddressValidator = (condition) => (control:FormGroup) => { 
    var street:FormControl = control.controls.street; 
    var place:FormControl = control.controls.place; 
    var postalcode:FormControl = control.controls.postalcode; 

    if (my conditions are ok) { 
     return null; 
    } else { 
     return { valid: false }; 
    } 
}; 

をパラメータを受け取り、検証関数を返す関数を作成し、

'address': fb.group({ 
      'street': ['', Validators.maxLength(300)], 
      'place': [''], 
      'postalcode': [''] 
    }), { validator:() => fullAddressValidator(condition) }) 
+0

私はパラメータとして渡す必要がありますか? – smartmouse

+0

条件です。条件は、値、コンポーネントのメソッド、クラスインスタンスまたは関数です。バリデータの内側のスコープにアクセスできる追加のチェックを行うには、バリデータ内で使用できます。メソッドを渡すと、メソッドは検証チェック時にコンポーネントの状態にアクセスできます。メソッドや関数を渡すときは、必ず '()=>'の矢印関数の構文を使用してください。 –

+0

私は現在、カスタムバリデーターに 'FormGroup'を全部持っていますので、すべての条件を' FormControl'sで確認できます。私が間違っている? – smartmouse

0

のようにそれを使用するはい、それはFormGroupカスタムバリデータ内FormControlバリデータを設定することが可能です。ここに私のニーズへの解決策があります:

export const fullAddressValidator = (control:FormGroup):any => { 
    var street:FormControl = control.controls.street; 
    var place:FormControl = control.controls.place; 
    var postalcode:FormControl = control.controls.postalcode; 

    if (!street.value && !place.value && !postalcode.value) { 
     street.setValidators(null); 
     street.updateValueAndValidity({onlySelf: true}); 
     place.setValidators(null); 
     place.updateValueAndValidity({onlySelf: true}); 
     postalcode.setValidators(null); 
     postalcode.updateValueAndValidity({onlySelf: true}); 

     return null; 
    } else { 
     street.setValidators([Validators.required, Validators.maxLength(300)]); 
     street.updateValueAndValidity({onlySelf: true}); 
     place.setValidators([Validators.required]); 
     place.updateValueAndValidity({onlySelf: true}); 
     if (place.value instanceof Country) { 
      postalcode.setValidators(Validators.maxLength(5)); 
      postalcode.updateValueAndValidity({onlySelf: true}); 
     } else { 
      postalcode.setValidators([zipValidator()]); 
      postalcode.updateValueAndValidity({onlySelf: true}); 
     } 
    } 

    if (street.invalid || place.invalid || postalcode.invalid) { 
     return {valid: false}; 

    } else { 
     return null; 
    } 
}; 
関連する問題