(cambia) vs (ngModelChange) in angolare


326

Angular 1 non accetta onchange()eventi, accetta solo ng-change()eventi.

Angolare 2, d'altra parte, accetta entrambi (change)e (ngModelChange)gli eventi, che sia sembra stia facendo la stessa cosa.

Qual è la differenza?

qual è il migliore per le prestazioni?

ngModelChange :

<input type="text" pInputText class="ui-widget ui-text"
    (ngModelChange)="clearFilter()" placeholder="Find"/>

vs cambiamento :

<input type="text" pInputText class="ui-widget ui-text" 
    (change)="clearFilter()" placeholder="Find"/>

2
Non voglio confrontarli. Voglio solo sapere qual è il migliore per le prestazioni?
Ramesh Rajendran,

6
Sì, non c'è paragone. Se stai usando ngModel puoi usare la versione successiva, altrimenti la prima. Ha sempre preferito evitare ngModel in quanto è un'associazione di dati bidirezionale, quindi non va bene per le prestazioni
Vamshi,

2
Modificato per porre l'accento su "qual è la differenza" e "che è più performante" per rimuovere la soggettività e votato per riaprire.
ruffin,

12
In Angular 7, (ngModelChange) = "eventHandler ()" verrà generato PRIMA che il valore associato a [(ngModel)] = "value" venga modificato mentre (change) = "eventHandler ()" verrà attivato DOPO il valore associato a [(ngModel)] = "value" è cambiato.
CAK2

4
A proposito, l'evento (cambia) viene generato solo quando lo stato attivo lascia l'input. Se si desidera che un evento venga generato dopo ogni pressione di un tasto, è possibile utilizzare l'evento (input).
John Gilmer,

Risposte:


496

(change) evento associato all'evento di modifica dell'ingresso classico.

https://developer.mozilla.org/en-US/docs/Web/Events/change

È possibile utilizzare (modificare) l'evento anche se non si dispone di un modello come input

<input (change)="somethingChanged()">

(ngModelChange)è la @Outputdirettiva di ngModel. Si attiva quando il modello cambia. Non è possibile utilizzare questo evento senza la direttiva ngModel.

https://github.com/angular/angular/blob/master/packages/forms/src/directives/ng_model.ts#L124

Man mano che scopri di più nel codice sorgente, (ngModelChange)emette il nuovo valore.

https://github.com/angular/angular/blob/master/packages/forms/src/directives/ng_model.ts#L169

Quindi significa che hai la capacità di tale utilizzo:

<input (ngModelChange)="modelChanged($event)">
modelChanged(newObj) {
    // do something with new value
}

Fondamentalmente, sembra che non ci sia una grande differenza tra due, ma gli ngModeleventi ottengono il potere quando lo usi [ngValue].

  <select [(ngModel)]="data" (ngModelChange)="dataChanged($event)" name="data">
      <option *ngFor="let currentData of allData" [ngValue]="currentData">
          {{data.name}}
      </option>
  </select>
dataChanged(newObj) {
    // here comes the object as parameter
}

supponi di provare la stessa cosa senza " ngModelcose"

<select (change)="changed($event)">
    <option *ngFor="let currentData of allData" [value]="currentData.id">
        {{data.name}}
    </option>
</select>
changed(e){
    // event comes as parameter, you'll have to find selectedData manually
    // by using e.target.data
}

1
Cosa succederà se sto usando un evento change con l'oggetto ngmodel?
Ramesh Rajendran,

6
@RameshRajendran Ho migliorato la risposta. È ancora possibile utilizzare l'evento change con l'oggetto ngModel, ma change event passa il parametro event, l'evento ngModelChange passa il nuovo valore.
omeralper,

1
Sì +1. Ma ho un problema con ngmodelchange, quando cancelli tutti i valori dalla casella di testo usando ctr + A. quindi ngModelChange non si attiva.
Ramesh Rajendran,

6
<input (ngModelChange)="modelChanged($event)">non è giusto, [ngModel]è richiesto.
e-cloud,

3
Qualcosa, non puoi fare un (change), in questo caso, puoi fare un(onClick)="yourFunction(youParameter)"
jpmottin

83

In Angolare 7, il (ngModelChange)="eventHandler()"fuoco sparerà prima che il valore associato [(ngModel)]="value"sia cambiato mentre il (change)="eventHandler()"fuoco sparerà dopo che il valore [(ngModel)]="value"è cambiato.


1
Ho appena testato in Angular 7.1 e il valore di ngModel viene aggiornato prima che venga chiamato l'evento. Quindi è quello che uso
Jahrenski l'

Ha funzionato anche in angolare 6. +1 per
avermi

1
Non è il contrario? Secondo Angular Docs, gli ngModelChange incendi dopo l'aggiornamento del modello di visualizzazione.
rabbia,

3
Nell'ultima documentazione di angular
pioro90

4
In Angular 7.2, infatti, l' (ngModelChange)evento viene generato prima che il valore venga modificato e (change) dopo che sia cambiato. Grazie per le informazioni, super utile!
Dennis Ameling

15

Come ho trovato e scritto in un altro argomento, questo vale per angolare <7 (non sono sicuro di come sia in 7+)

Solo per il futuro

abbiamo bisogno di osservare che [(ngModel)]="hero.name"è solo una scorciatoia che può essere de-zuccherato a: [ngModel]="hero.name" (ngModelChange)="hero.name = $event".

Quindi se eliminiamo lo zucchero dal codice finiremmo con:

<select (ngModelChange)="onModelChange()" [ngModel]="hero.name" (ngModelChange)="hero.name = $event">

o

<[ngModel]="hero.name" (ngModelChange)="hero.name = $event" select (ngModelChange)="onModelChange()">

Se si controlla il codice sopra riportato, si noterà che si verificano 2 ngModelChangeeventi e questi devono essere eseguiti in un certo ordine.

Riassumendo: se si posiziona ngModelChangeprima ngModel, si ottiene $eventcome il nuovo valore, ma l'oggetto modello mantiene ancora il valore precedente. Se lo si inserisce dopo ngModel, il modello avrà già il nuovo valore.

FONTE


Grazie per averlo sottolineato! Ho avuto questo problema fino a quando non ho trovato la tua spiegazione
omostan,

2

1 - (change) è associato all'evento HTML onchange. La documentazione su HTML Onchange dice quanto segue:

Esegui un JavaScript quando un utente modifica l'opzione selezionata di un <select>elemento

Fonte: https://www.w3schools.com/jsref/event_onchange.asp

2 - Come affermato in precedenza, (ngModelChange)è associato alla variabile del modello associata all'input.

Quindi, la mia interpretazione è:

  • (change)si innesca quando l' utente modifica l'input
  • (ngModelChange) si attiva quando il modello cambia, indipendentemente dal fatto che sia consecutivo a un'azione dell'utente o meno
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.