Ich versuche, eine Änderung ngModel
in einem <select>
Tag zu erkennen. In Angular 1.x könnten lösen wir dies mit einem $watch
auf ngModel
, oder durch die Verwendung ngChange
, aber ich habe noch zu verstehen , wie eine Änderung zu erfassen , ngModel
in Angular 2.
Vollständiges Beispiel : 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);
}
}
Wie wir sehen können, spiegeln unsere ngModel
Änderungen und der interpolierte Ausdruck in der Ansicht dies wider , wenn wir einen anderen Wert aus der Dropdown-Liste auswählen .
Wie werde ich über diese Änderung in meiner Klasse / meinem Controller informiert?
javascript
angular
Lux
quelle
quelle
Antworten:
Update :
Trennen Sie die Ereignis- und Eigenschaftsbindungen:
Sie könnten auch verwenden
und dann müssten Sie das Modell im Ereignishandler nicht aktualisieren, aber ich glaube, dies führt dazu, dass zwei Ereignisse ausgelöst werden, sodass es wahrscheinlich weniger effizient ist.
Alte Antwort, bevor sie einen Fehler in Beta.1 behoben haben:
Erstellen Sie eine lokale Vorlagenvariable und fügen Sie ein
(change)
Ereignis hinzu:plunker
Siehe auch Wie kann ich in "Auswählen" in Winkel 2 eine neue Auswahl erhalten?
quelle
ngModel
wenn ich nur eine neue Variable namensitem
binde? Ist es nicht sinnvoll,ngModel
in Klammern zu setzen, um Ereignis-Listener zu erhalten? Warum führen wir also eine neue Variable ein?selectedItem
sind unsere gebundenen Daten, die NgModel automatisch für uns aktualisiert, aber ... es benachrichtigt uns nicht über Änderungen, was oft gut genug ist (Ansichten und solche werden aktualisiert), aber offensichtlich ist dies nicht gut genug für Ihren Anwendungsfall. In der anderen SO-Frage, auf die ich verwiesen habe, beschreibe ich, wie ich versucht habe(ngModelChange)
, über Änderungen benachrichtigt zu werden, aber sie wird für jede Änderung zweimal aufgerufen. Ich weiß nicht, ob das ein Fehler ist oder nicht. Wie auch immer, das Hinzufügen einer(change)
Ereignisbindung scheint das Problem zu lösen.selectedItem
beionChange()
Bränden nicht aktualisiert wird. Daher benötigen wir anscheinend diese lokale Vorlagenvariable.#
oder#item
in unserem Fall ist eine lokale Referenz. Deshalb können wir dasitem.change
dort tun .ngModelChange
benutzerdefinierte Ereignis binden . Das Problem ist, dass<select>
dieses Ereignis bei jeder Änderung zweimal ausgelöst wird.Ich bin über diese Frage gestolpert und werde meine Antwort einreichen, die ich verwendet habe und die ziemlich gut funktioniert hat. Ich hatte ein Suchfeld, das gefiltert und eine Reihe von Objekten und in meinem Suchfeld habe ich das verwendet
(ngModelChange)="onChange($event)"
in meinem
.html
dann in meinem
component.ts
quelle
ngModelChange
,$event
ist dies kein DOM- Ereignis . Es ist vielmehr der aktuelle Wert des Formularelements, bei dem es sich um eine Zeichenfolge für ein Eingabeelement handelt.