2016-11-30 18 views
7

Tôi đang cố gắng tạo xác nhận có điều kiện theo yêu cầu trên một trường cụ thể. Tôi thử làm điều này bằng cách trả về Validators.required trở lại chức năng của tôi, nhưng điều này dường như không hoạt động. Làm thế nào để tôi làm việc này? Đây là mã của tôi:Angular2: Xác nhận yêu cầu có điều kiện

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); 

       } 
      }); 
     }; 
    }; 

Bất kỳ trợ giúp nào được đánh giá cao.

+0

Cậu giải quyết này? Tôi đã thêm một câu trả lời, và tò mò nếu bạn giải quyết nó theo cùng một cách (hoặc thậm chí theo cách tốt hơn) – Erex

+1

Tôi đã giải quyết vấn đề tương tự với trình kiểm tra tùy chỉnh có thể tái sử dụng như được hiển thị ở đây: [Yêu cầu có điều kiện] (http: // stackoverflow. com/questions/38204812/angular2-forms-validator-với-interrelated-fields/40416197 # 40416197) –

+0

ah, có vẻ thiên tài! Tôi sẽ kiểm tra giải pháp của bạn sau đó! – Erex

Trả lời

20

Tôi gặp sự cố tương tự nhưng không thể tìm thấy câu trả lời. Vì không ai trả lời câu hỏi này, tôi sẽ cung cấp một ví dụ về cách tôi giải quyết vấn đề của mình và cách bạn có thể giải quyết vấn đề của mình bằng cách sử dụng cùng một giải pháp.

Ví dụ: (Số điện thoại là cần thiết chỉ nếu email không được thiết lập)

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.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 
} 

} 

Vì vậy, trong trường hợp của bạn, bạn nên thêm một ChangeListener để "_ansat" bằng nghe email của tôi, và sau đó thêm yêu cầu để "_helbred" cho phù hợp.

2

Chỉ cần thêm xác nhận cho lĩnh vực này:

if(some_logic) { 
this.your_form.get('field_name').setValidators([Validators.required]); 
} 
Các vấn đề liên quan