2017-08-24 25 views
0

入力のngModelに基づいて内部値を更新する指示があります。これは、ユーザーが手動で値を入力するとうまく動作しますが、ngModelがコンポーネントから変更されたときに機能しなくなります。ngModelがユーザー入力なしのコンポーネントから変更されたときにngModelChangeが発生しない

コンポーネントテンプレート:

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

は、コンポーネントにngModelを変更する:

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

指令:ngModelは、APIコールの後、コントローラから更新された場合

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

、ngModelChangeディレクティブで_valueInDirectiveは更新されません。 ngModelが更新されるたびに、directiveの値も同様に変更されるようにするにはどうすればよいですか?

+1

とすることはできません。 'ngModelChange'は、入力要素の値が変更されたときだけ出力されます。 –

+0

@GünterZöchbauerしかし、ngModelの変更後、入力要素の値も同様に変更されます。 – Senthe

+0

'[ngModel] =" myValue "の変更検出で' myValue'が変更されたことが検出されると、 'ngModel'プロパティが更新されます。 Angularは変更のためにランダムなフィールドを観察しません。バインディングだけを観察します。 ''(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

値を変更したときにメソッドを自分で呼び出すのはどうですか?ゲッター/セッターにバインドしたフィールドを作成し、セッターで追加コードを呼び出すこともできます。 –

+0

コントローラの値を変更し、ディレクティブでメソッドを呼び出す必要があるためです。 3回目にこの情報を繰り返しています。 – Senthe

関連する問題