2017-08-24 456 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

相关问题