Estoy intentando detectar un cambio ngModel
en una <select>
etiqueta. En Angular 1.x, podríamos resolver esto con un $watch
on ngModel
, o usando ngChange
, pero todavía tengo que entender cómo detectar un cambio ngModel
en Angular 2.
Ejemplo completo : 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);
}
}
Como podemos ver, si seleccionamos un valor diferente del menú desplegable, nuestros ngModel
cambios y la expresión interpolada en la vista lo refleja.
¿Cómo me notifican de este cambio en mi clase / controlador?
javascript
angular
lux
fuente
fuente
Respuestas:
Actualización :
Separe las vinculaciones de eventos y propiedades:
También podrías usar
y luego no tendría que actualizar el modelo en el controlador de eventos, pero creo que esto hace que se activen dos eventos, por lo que probablemente sea menos eficiente.
Respuesta anterior, antes de que arreglaran un error en beta.1:
Cree una variable de plantilla local y adjunte un
(change)
evento:plunker
Consulte también ¿Cómo puedo obtener una nueva selección en "seleccionar" en Angular 2?
fuente
ngModel
si solo estoy vinculando una nueva variable llamadaitem
? ¿No es el punto de ajustarngModel
entre paréntesis para adquirir oyentes de eventos, entonces, por qué estamos introduciendo una nueva variable?selectedItem
son nuestros datos vinculados, que NgModel actualiza automáticamente por nosotros, pero ... no nos notifica los cambios, lo que a menudo es lo suficientemente bueno (las vistas y demás se actualizarán), pero obviamente esto no es lo suficientemente bueno para su caso de uso. En la otra pregunta SO a la que hice referencia, describo cómo traté de usar(ngModelChange)
para recibir notificaciones de cambios, pero se llama dos veces para cada cambio. No sé si eso es un error o no. De todos modos, agregar un(change)
enlace de evento parece resolver el problema.selectedItem
no se actualiza cuando seonChange()
dispara, por lo que parece que necesitamos esa variable de plantilla local.#
o#item
en nuestro caso es una referencia local . De ahí por qué podemos hacerloitem.change
allí.ngModelChange
evento personalizado. El problema es que<select>
este evento se dispara dos veces por cada cambio.Me he encontrado con esta pregunta y enviaré mi respuesta que usé y funcioné bastante bien. Tenía un cuadro de búsqueda que filtraba una serie de objetos y en mi cuadro de búsqueda usé el
(ngModelChange)="onChange($event)"
en mi
.html
entonces en mi
component.ts
fuente
ngModelChange
,$event
no es un evento DOM . Más bien es el valor actual del elemento de formulario, que es una cadena para un elemento de entrada.