J'essaie de détecter un changement ngModel
dans une <select>
balise. Dans Angular 1.x, nous pourrions résoudre ce problème avec un $watch
on ngModel
ou en utilisant ngChange
, mais je n'ai pas encore compris comment détecter un changement ngModel
dans Angular 2.
Exemple complet : 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);
}
}
Comme nous pouvons le voir, si nous sélectionnons une valeur différente dans la liste déroulante, nos ngModel
modifications et l'expression interpolée dans la vue le reflètent.
Comment être informé de ce changement dans ma classe / mon contrôleur?
Réponses:
Mise à jour :
Séparez les liaisons d'événement et de propriété:
Vous pouvez également utiliser
et vous n'auriez pas à mettre à jour le modèle dans le gestionnaire d'événements, mais je crois que cela provoque le déclenchement de deux événements, donc c'est probablement moins efficace.
Ancienne réponse, avant de corriger un bogue dans la version bêta.1:
Créez une variable de modèle locale et attachez un
(change)
événement:plunker
Voir aussi Comment puis-je obtenir une nouvelle sélection dans "sélectionner" dans Angular 2?
la source
ngModel
si je lie juste une nouvelle variable appeléeitem
? N'est-ce pas l'intérêt de mettrengModel
entre parenthèses pour acquérir des écouteurs d'événements, alors pourquoi introduisons-nous une nouvelle variable?selectedItem
sont nos données liées, que NgModel met à jour automatiquement pour nous, mais ... il ne nous informe pas des changements, ce qui est souvent suffisant (les vues et autres seront mises à jour), mais évidemment ce n'est pas assez bon pour votre cas d'utilisation. Dans l'autre question SO à laquelle j'ai fait référence, je décris comment j'ai essayé d'utiliser(ngModelChange)
pour être notifié des modifications, mais elle est appelée deux fois pour chaque modification. Je ne sais pas si c'est un bug ou non. Quoi qu'il en soit, l'ajout d'une(change)
liaison d'événement semble résoudre le problème.selectedItem
n'est pas mis à jour lors duonChange()
déclenchement, il semble donc que nous ayons besoin de cette variable de modèle locale.#
ou#item
dans notre cas est une référence locale . D'où pourquoi nous pouvons le faireitem.change
.ngModelChange
événement personnalisé. Le problème est que<select>
cet événement se déclenche deux fois pour chaque changement.Je suis tombé sur cette question et je vais soumettre ma réponse que j'ai utilisée et travaillé assez bien. J'avais un champ de recherche qui filtrait et un tableau d'objets et sur mon champ de recherche, j'ai utilisé le
(ngModelChange)="onChange($event)"
dans mon
.html
puis dans mon
component.ts
la source
ngModelChange
,$event
n'est pas un événement DOM . Il s'agit plutôt de la valeur actuelle de l'élément de formulaire, qui est une chaîne pour un élément d'entrée.