2017-02-23 80 views
1

我寫了一個指令,它只接受實施ControlValueAccessor的數字。組件與指令事件優先級

onBlur我會更新它的模型,如下所示。

@HostListener('blur',['$event']) onBlur(event) { 
    this.directiveModel = this.getOnlyNumberLogic(); 
    this.propagateChange(this.directiveModel); <-- update model 
    this.renderer.setElementProperty(this.el.nativeElement, 'value', this.directiveModel); 
    } 

上述邏輯的作品完美,但問題是當我在組件元素的HTML添加(blur)象下面這樣:

<input type="text" name="number" 
    #numberId="ngModel" 
    required 
    [(ngModel)]="obj.number" 
    pattern="^\d{11}(?:\d{5})?$" 
    numberOnly <---- Directive 
    (blur)="numberId.valid && onNumberBlur(numberId.value)" 
    maxlength="16"/> 

每一個時間的成分的(blur)先執行然後指令的@HostListener('blur'),因爲其中[(ngModel)]未更新,因爲this.propagateChange()位於指令的blur內部,因此稍後調用。

問:

反正是有設定優先級指令的模糊應先執行?

回答

0

我用EventEmitter解決了上述問題。我有一個指令一個EventEmitter

@Output() onDirectiveBlur = new EventEmitter();

然後在指令的模糊我會發出這樣的事件,這是與該元素在組件的HTML綁定,如下面

@HostListener('blur',['$event']) onBlur(event) { 
    this.directiveModel = this.getOnlyNumberLogic(); 
    this.propagateChange(this.directiveModel); <-- update model 
    this.renderer.setElementProperty(this.el.nativeElement, 'value', this.directiveModel); 
    this.onDirectiveBlur.emit(); 
} 

<input type="text" name="number" 
    #numberId="ngModel" 
    required 
    [(ngModel)]="obj.number" 
    pattern="^\d{11}(?:\d{5})?$" 
    numberOnly <---- Directive 
    (onDirectiveBlur)="numberId.valid && onNumberBlur(numberId.value)" 
    maxlength="16"/> 

在這種情況下,組件的(自定義)blur只會在指令的blur a之後調用nd保證模型將始終得到更新。

我不接受這個答案(現在),因爲我覺得會有比事件onDirectiveBlur更好的方式,讓我知道你的想法。

+0

請注意,請不要使用'new EventEmitter ();'使用'新的EventEmitter();'後者更安全,更易於閱讀。很多時候人們陷入思考的陷阱 - 因爲'--noImplicitAny'很好,明確的'any's都可以。他們是最後的手段。請不要養成亂拋垃圾的習慣,因爲它會讓你和其他人感到痛苦 –

+1

肯定@AluanHaddad感謝你的建議。 – yashhy

+0

對不起,我對這個話題有些激動;) –