2017-09-22 2 views
4

두 개의 컨트롤에 값이 있는지 확인하는 지시문을 각도로 작성했습니다. 그중 하나가 채워지면 다른 하나는 채워 져야하므로 비어 있거나 채워져 있어야합니다. 지금까지 문제가 없습니다.각도 - 버튼을 누를 때 지시문의 입력이 업데이트되지 않음

이 지시문은 기본적으로 사용하지 않도록 설정해야합니다. 버튼을 누른 후에 만 ​​활성화해야합니다. 이를 제어하기 위해, 나는 변수를 결합하는 지시어에 @Input가 그 '사실'에있는 버튼 세트 :

import { Validator, FormControl, NG_VALIDATORS, FormGroup, NgForm } from '@angular/forms'; 
import { Directive, forwardRef, Input, ElementRef } from '@angular/core'; 

@Directive({ 
    selector: '[correquired][ngModel]', 
    providers: [ 
     { provide: NG_VALIDATORS, useExisting: forwardRef(() => CorrequiredDirective), multi: true } 
    ] 
}) 
export class CorrequiredDirective implements Validator { 
    @Input() other: FormControl; 
    @Input() enabled: boolean; 

    validate(c: FormControl): { [index: string]: any; } { 
     if (!this.enabled) { return null; } 

     if (this.other != null && this.other.value != null && this.other.value.trim && this.other.value.trim() === '') { 
     this.other.setValue(null); 
     } 

     if (c.value != null && c.value.trim && c.value.trim() === '') { 
      c.setValue(null); 
     } 

     if (c.value != null && c.value != undefined) { 
      this.other.markAsTouched(); 
     } 

     if (this.other != null && c.value == null && this.other.value != null) { 
      return { 'correquired': { valid: false } }; 
     } 
    } 
} 

그리고, 구성 요소, 내가 컨트롤을 설정이 방법 :

<input type="text" correquired [other]="form3.controls['delivered_quantity']" [enabled]="publishing" ... 

"publishing"변수를 true로 설정하는 단추에서도 양식을 전송합니다. 문제는이 버튼을 누를 때 "publishing"값을 변경하기 전에 지시문이 실행되고 그 이후가 아니므로 지시어의 "enabled"변수는 항상 false입니다. 버튼을 눌렀을 때 어떻게 업데이트 할 수 있습니까?

미리 감사드립니다.

답변

0

좋아, 진실 변수를 설정시 버튼을 호출하는 방법에있어서의 setTimeout을 첨가하여 해결할 수 :

publish() {   
    this.publishing = true;  

    setTimeout(() => { 
     if (this.form3.control.controls['delivered_quantity'] != null) { 
      this.form3.control.controls['delivered_quantity'].updateValueAndValidity(); 
     } 
     if (this.form3.control.controls['delivered_no'] != null) 
      this.form3.control.controls['delivered_no'].updateValueAndValidity(); 
     if (this.formsValid && this.radioForm.valid) { 
      if (this.formsDirty) { 
       this.doSave() 
        .add(() => { 
         this.doPublish(); 
        }); 
      } else { 
       this.doPublish(); 
      } 
     } 
    }, 0); 
}