選択タグのngModelへの変更を検出(Angular 2)


97

私は上の変化を検出しようとしていますngModel<select>タグ。Angular 1.xでは、$watchon ngModelを使用して、またはを使用してこれを解決するngChange場合がありますがngModel、Angular 2での変更を検出する方法はまだわかりません。

完全な例http : //plnkr.co/edit/9c9oKH1tjDDb67zdKmr9?p=info

import {Component, View, Input, } from 'angular2/core';
import {FORM_DIRECTIVES} from 'angular2/common';

@Component({
    selector: 'my-dropdown'
})
@View({
    directives: [FORM_DIRECTIVES],
    template: `
        <select [ngModel]="selection" (ngModelChange)="onChange($event, selection)" >
            <option *ngFor="#option of options">{{option}}</option>
        </select>
        {{selection}}
    `
})
export class MyDropdown {
    @Input() options;

    selection = 'Dog';

    ngOnInit() {
        console.log('These were the options passed in: ' + this.options);
  }

  onChange(event) {
    if (this.selection === event) return;
    this.selection = event;
    console.log(this.selection);
  }

}

ご覧のように、ドロップダウンから別の値を選択すると、ngModel変更、およびビュー内の補間された式がこれを反映します。

クラス/コントローラーのこの変更を通知するにはどうすればよいですか?


1
追加のコメントのいくつかを抑えておきたい場合があります。あなたはこの質問が変装した暴言としてフラグを立てられることを望まない。 stackoverflow.com/help/dont-ask
Claies、2015

回答:


234

更新

イベントとプロパティのバインディングを分離します。

<select [ngModel]="selectedItem" (ngModelChange)="onChange($event)">
onChange(newValue) {
    console.log(newValue);
    this.selectedItem = newValue;  // don't forget to update the model here
    // ... do other stuff here ...
}

あなたも使うことができます

<select [(ngModel)]="selectedItem" (ngModelChange)="onChange($event)">

その後、イベントハンドラーでモデルを更新する必要はありませんが、これにより2つのイベントが発生するため、おそらく効率が低下します。


彼らがbeta.1のバグを修正する前の古い答え:

ローカルテンプレート変数を作成し、(change)イベントをアタッチします。

<select [(ngModel)]="selectedItem" #item (change)="onChange(item.value)">

plunker

Angular 2の「select」で新しい選択を取得するにどうすればよいですか?も参照してください


1
ngModelという名前の新しい変数をバインドしているだけの場合、どういう意味itemですか?ngModel括弧で囲んでイベントリスナーを取得するのではなく、なぜ新しい変数を導入するのですか?
lux

2
@lux、そうですね、いい質問です。 selectedItemバインドされたデータであり、NgModelが自動的に更新しますが、変更は通知されません。これは多くの場合十分です(ビューなどが更新されます)が、これは明らかにユースケースには不十分です。私が参照した他のSOの質問(ngModelChange)では、変更の通知を取得するためにどのように使用しようとしたかを説明しますが、変更ごとに2回呼び出されます。それがバグかどうかわかりません。とにかく、(change)イベントバインディングを追加すると問題が解決するようです。
Mark Rajcok、2015

また、発砲selectedItem時に更新されないことを示すプランカーを更新したonChange()ため、ローカルテンプレート変数が必要なようです。
Mark Rajcok、2015

@lux #または#itemこの場合はローカル参照です。それが、なぜ私たちがitem.changeそこでできるのか。
Mark Pieszak-Trilon.io 2015年

@lux、フックする方法についてはすでに説明しました:ngModelChangeカスタムイベントにバインドします。問題は、では<select>、このイベントが変更ごとに2回発生することです。
Mark Rajcok、2015

12

私はこの質問に出くわしました。使用してかなりうまく機能した私の回答を提出します。フィルタリングされたオブジェクトの配列を備えた検索ボックスがあり、私の検索ボックスでは(ngModelChange)="onChange($event)"

私の中で .html

<input type="text" [(ngModel)]="searchText" (ngModelChange)="reSearch(newValue)" placeholder="Search">

それから私の中で component.ts

reSearch(newValue: string) {
    //this.searchText would equal the new value
    //handle my filtering with the new value
}

5
FYIだけがにバインドされている場合、DOM イベントngModelChange$eventはありません。むしろ、それは入力要素の文字列であるフォーム要素の現在の値です。
Mark Rajcok 16

@MarkRajcokこのドキュメントを参照してください。開発チームの他のメンバーと共有できますか?
ニールS

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.