2017-08-24 455 views
0

我有一個指令應該根據輸入的ngModel更新一些內部值。當用戶手動輸入值時,這可以正常工作,但在從組件更改ngModel時停止工作。當ngModel從沒有用戶輸入的組件更改時,ngModelChange不會觸發

組件模板:

<input [(ngModel)]="myValue" myExample> 

在成分變更ngModel:

ngOnInit() { 
    this.getDataFromApi() 
    .then((result) => { 
    this.myValue = result; 
    }) 
} 

指令:

import { Directive, OnInit } from '@angular/core'; 
import { NgModel } from '@angular/forms'; 

@Directive({ 
    selector: '[myExample][ngModel]', 
    providers: [NgModel], 
    host: { 
    '(ngModelChange)' : 'onModelChange($event)', 
    } 
}) 
export class myExampleDirective implements OnInit { 
    private _valueInDirective; 

    constructor(private _element: ElementRef, private _model: NgModel) { } 

    onModelChange(event) { 
    this._valueInDirective = event; 
    } 
} 

如果ngModel從控制器的API調用之後更新,ngModelChange在指令不會觸發並且_valueInDirective不會更新。如何確保每次ngModel更新時,指令中的值也會被更改?

+1

它不應該。 'ngModelChange'只在輸入元素值發生變化時發出。 –

+0

@GünterZöchbauer,但在ngModel更改後,輸入元素的值也會更改,對不對? – Senthe

+0

當檢測到[ngModel] =「myValue」檢測到「myValue」發生變化時,它將更新ngModel屬性。角度不會觀察隨機場的變化,它只會觀察綁定。 '(ngModelChange)'([(ngModel)]')的'()'部分僅爲** **當'NgModel'指令調用'this.ngModelChange.next(someValue)'時調用' –

回答

0

我試用了DoCheck掛鉤,但事實證明它效率極低。這是我最終解決的解決方案,我很滿意:

import { Directive, OnInit } from '@angular/core'; 
import { NgModel } from '@angular/forms'; 

@Directive({ 
    selector: '[myExample][ngModel]', 
    providers: [NgModel] 
}) 
export class myExampleDirective implements OnInit { 
    private _valueInDirective; 

    constructor(private _model: NgModel) { } 

    ngOnInit() { 
    this._model.valueChanges.subscribe((event) => { 
     this._valueInDirective = event; 
     // do other stuff 
    }); 
    } 
} 
+0

那麼當你改變這個值時你自己調用一個方法有什麼問題?你也可以將你綁定到getter/setter的字段放在setter中並調用其他代碼。 –

+0

因爲我改變了控制器中的值,並且需要在指令中調用方法。我正在第三次重複這些信息。 – Senthe

相關問題