2015-12-21 26 views
44

Sto tentando di rilevare una modifica su ngModel in un tag <select>. In 1.x angolare, potremmo risolvere questo problema con un $watch su ngModel, oppure utilizzando ngChange, ma devo ancora capire come rilevare una modifica ngModel in angolare 2.Rileva modifiche a ngModel su un tag select (Angular 2)

Esempio: http://plnkr.co/edit/9c9oKH1tjDDb67zdKmr9?p=info

Come possiamo vedere, se selezioniamo un valore diverso dal menu a discesa, le nostre variazioni ngModel e l'espressione interpolata nella vista lo riflettono.

Come si ottiene la notifica di questo cambiamento nella mia classe/controller?

+1

si consiglia di mantenere alcuni dei commenti aggiuntivi sotto controllo; non vuoi che questa domanda venga contrassegnata come una sfuriata sotto mentite spoglie. http://stackoverflow.com/help/dont-ask. – Claies

risposta

125

Aggiornamento:

Separare i binding di eventi e proprietà:

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

Si potrebbe anche usare

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

e quindi non avrebbe dovuto aggiorna il modello in il gestore dell'evento, ma credo che questo faccia scattare due eventi, quindi è probabilmente meno efficiente.


Vecchio risposta, prima che Corretto un bug nella beta.1:

creare una variabile modello locale e allegare un evento (change):

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

plunker

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

+0

Quindi qual è il punto di 'ngModel' se lego solo una nuova variabile chiamata' item'?Non è il caso di avvolgere 'ngModel' tra parentesi per acquisire listener di eventi, quindi perché stiamo introducendo una nuova variabile? – lux

+1

@lux, si bella domanda. 'selectedItem' sono i nostri dati vincolati, che NgModel si aggiorna automaticamente per noi, ma ... non ci informa delle modifiche, che spesso sono abbastanza buone (viste e tali aggiornamenti si aggiornano), ma ovviamente questo non è abbastanza buono per il tuo caso d'uso. Nell'altra domanda SO a cui ho fatto riferimento, descrivo come ho provato a usare '(ngModelChange)' per ricevere notifiche delle modifiche, ma viene chiamato due volte per ogni modifica. Non so se sia un bug o no. Ad ogni modo, l'aggiunta di un binding di eventi '(change)' sembra risolvere il problema. –

+0

Inoltre, ho aggiornato il plunker che mostra che 'selectedItem' non viene aggiornato quando viene attivato' onChange() ', quindi sembra che abbiamo bisogno di quella variabile di template locale. –

7

Mi sono imbattuto in questa domanda e presenterò la mia risposta che ho usato e lavorato abbastanza bene. Ho avuto una casella di ricerca che filtrava e array di oggetti e sulla mia casella di ricerca ho usato il (ngModelChange)="onChange($event)"

nel mio .html

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

poi nella mia component.ts

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

Solo FYI, in caso di associazione a 'ngModelChange',' $ event' non è un DOM [Event] (https://developer.mozilla.org/en-US/docs/Web/API/Event). Piuttosto è il valore corrente dell'elemento form, che è una stringa per un elemento di input. –

+0

@MarkRajcok puoi indicarmi la documentazione per questo, quindi posso condividere con il resto del mio team di sviluppo? –

+1

@NeilS, il più vicino è https://angular.io/docs/ts/latest/guide/template-syntax.html#!#ngModel –

-2

questo in realtà non rileva il modello cambia, rileva qualsiasi evento di cambiamento nel campo di input. Ad esempio, se il campo di input ha un valore "my_search_word" e lo cambi in "my_search_word_2", quindi torna a "my_search_word", il valore del modello in questo caso non cambia in realtà, ma reSearch($event) pensa ancora che ci sia un cambiamento .

Problemi correlati