2015-12-21 15 views
44

Ich versuche eine Änderung an ngModel in einem <select> Tag zu erkennen. In Angular 1.x könnten lösen wir dies mit einem $watch auf ngModel oder durch ngChange, aber ich habe noch zu verstehen, wie eine Änderung ngModel in Angular 2.Erkenne Änderung an ngModel an einem ausgewählten Tag (Angular 2)

Beispiel zu erkennen: http://plnkr.co/edit/9c9oKH1tjDDb67zdKmr9?p=info

Wie wir sehen können, wenn wir einen anderen Wert aus dem Dropdown wählen, ändert sich unser ngModel, und der interpolierte Ausdruck in der Ansicht spiegelt dies wider.

Wie werde ich über diese Änderung in meiner Klasse/Controller benachrichtigt?

+1

möchten Sie vielleicht einige der zusätzlichen Kommentare in Schach halten; Sie wollen nicht, dass diese Frage als eine getarnte Tirade markiert wird. http://stackoverflow.com/help/dont-ask. – Claies

Antwort

125

aktualisieren:

Trennen Sie die Veranstaltung und Eigentum Bindungen:

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

Sie auch

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

und dann würden Sie nicht haben verwenden könnte Aktualisieren Sie das Modell in der Event-Handler, aber ich glaube, dass zwei Ereignisse auslösen, also ist es wahrscheinlich weniger effizient.


Alte Antwort, bevor sie einen Fehler in beta.1 behoben:

Erstellen Ihnen ein lokales Template-Variable und fügen Sie ein (change) Ereignis:

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

plunker

See auch How can I get new selection in "select" in Angular 2?

+0

Also was ist der Sinn von 'ngModel', wenn ich nur eine neue Variable namens' item' binde?Ist es nicht der Sinn, 'ngModel' in Klammern zu verpacken, um Ereignis-Listener zu erhalten, warum also führen wir eine neue Variable ein? – lux

+1

@lux, yeah gute Frage. 'selectedItem' sind unsere gebundenen Daten, die NgModel automatisch für uns aktualisiert, aber ... es benachrichtigt uns nicht über Änderungen, die oft gut genug sind (Aufrufe und solche werden aktualisiert), aber offensichtlich ist das nicht gut genug für Sie Anwendungsfall. In der anderen SO-Frage, auf die ich Bezug genommen habe, beschreibe ich, wie ich versuchte, '(ngModelChange)' zu verwenden, um über Änderungen benachrichtigt zu werden, aber es wird zweimal für jede Änderung aufgerufen. Ich weiß nicht, ob das ein Bug ist oder nicht. Wie auch immer, das Hinzufügen einer '(change)' -Ereignisbindung scheint das Problem zu lösen. –

+0

Außerdem habe ich den Plunker aktualisiert, der zeigt, dass 'selectedItem' nicht aktualisiert wird, wenn' onChange() 'ausgelöst wird, daher scheint es, dass wir diese lokale Template-Variable brauchen. –

7

Ich bin über diese Frage gestolpert und ich werde meine Antwort einreichen, dass ich ziemlich gut verwendet und gearbeitet habe. Ich hatte ein Suchfeld, das Objekt gefiltert und Anordnung von und auf meinem Suchfeld verwenden ich die (ngModelChange)="onChange($event)"

in meinem .html

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

dann in meinem component.ts

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

Just FYI, wenn $ nbModelChange bindet, ist "$ event" kein DOM [Event] (https://developer.mozilla.org/en-US/docs/Web/API/Event). Es ist vielmehr der aktuelle Wert des Formularelements, der eine Zeichenfolge für ein Eingabeelement darstellt. –

+0

@MarkRajcok kannst du mir bitte auf Dokumentation verweisen, damit ich mit dem Rest meines Entwicklerteams teilen kann? –

+1

@NeilS, die nächste ist https://angular.io/docs/ts/latest/guide/template-syntax.html#!#ngModel –

-2

das wirklich nicht erkennt Der Modellwechsel erkennt jedes Änderungsereignis im Eingabefeld. Wenn das Eingabefeld beispielsweise einen Wert "my_search_word" hat und Sie es in "my_search_word_2" ändern, dann zurück zu "my_search_word" ändert sich der Modellwert in diesem Fall nicht wirklich, aber reSearch($event) denkt immer noch, dass es eine Änderung gibt .

Verwandte Themen