400 votes

(change) vs (ngModelChange) dans angular

Angular 1 n'accepte pas onchange() l'événement, c'est seulement accepte ng-change() événement.

Angular 2, en revanche, accepte à la fois (change) y (ngModelChange) qui semblent tous deux faire la même chose.

Quelle est la différence ?

lequel est le meilleur pour les performances ?

ngModelChange :

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

vs changement :

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

1 votes

Si vous voulez comparer les deux, vous pouvez peut-être aussi ajouter (change) y (keyup)

2 votes

Je ne veux pas les comparer. Je veux juste savoir lequel est le plus performant ?

7 votes

Oui, il n'y a aucune comparaison. Si vous utilisez ngModel, vous pouvez utiliser le dernier, sinon le premier. Il est toujours préférable d'éviter le ngModel, car il s'agit d'une liaison de données à double sens, ce qui nuit aux performances.

585voto

omeralper Points 4392

(change) lié à l'événement classique de changement d'entrée.

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

Vous pouvez utiliser l'événement (de changement) même si vous n'avez pas de modèle à votre entrée comme

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

(ngModelChange) es el @Output de la directive ngModel. Il se déclenche lorsque le modèle change. Vous ne pouvez pas utiliser cet événement sans la directive ngModel.

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

Au fur et à mesure que vous découvrez le code source, (ngModelChange) émet la nouvelle valeur.

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

Cela signifie donc que vous avez la capacité d'une telle utilisation :

<input (ngModelChange)="modelChanged($event)">

modelChanged(newObj) {
    // do something with new value
}

En fait, il semble qu'il n'y ait pas de grande différence entre les deux, mais ngModel gagne en puissance lorsque vous utilisez [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
}

supposez que vous essayez la même chose sans " ngModel choses"

<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 votes

Que se passera-t-il si j'utilise un événement de changement avec un objet ngmodel ?

6 votes

@RameshRajendran J'ai amélioré la réponse. Vous pouvez toujours utiliser l'événement change avec l'objet ngModel, mais l'événement change passe le paramètre de l'événement, l'événement ngModelChange passe la nouvelle valeur.

1 votes

Ouais +1 . Mais j'ai un problème avec ngmodelchange, lorsque vous effacez toutes les valeurs de la zone de texte en utilisant ctr + A. alors ngModelChange ne se déclenche pas .

115voto

user773906 Points 11

Dans Angular 7, l'élément (ngModelChange)="eventHandler()" tirera antes de la valeur liée à [(ngModel)]="value" est modifié alors que le (change)="eventHandler()" tirera après la valeur liée à [(ngModel)]="value" est modifié.

1 votes

Je viens de tester dans Angular 7.1 et la valeur du ngModel est mise à jour avant l'appel de l'événement. C'est donc ce que j'utilise

0 votes

Cela a fonctionné dans angular 6 également. +1 pour m'avoir fait gagner du temps :)

1 votes

N'est-ce pas l'inverse ? D'après le document Angular Docs ngModelChange se déclenche après la mise à jour du modèle de la vue.

30voto

Disaster Points 511

Comme je l'ai constaté et écrit dans un autre topic - ceci s'applique à angular < 7 (je ne sais pas comment c'est dans 7+)

Juste pour l'avenir

nous devons observer que [(ngModel)]="hero.name" n'est qu'un raccourci qui peut être dé-sucré : [ngModel]="hero.name" (ngModelChange)="hero.name = $event" .

Donc, si on désucre le code, on obtiendra :

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

ou

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

Si vous inspectez le code ci-dessus, vous remarquerez que nous nous retrouvons avec 2 ngModelChange et ceux-ci doivent être exécutés dans un certain ordre.

En résumé : Si vous placez ngModelChange avant ngModel vous obtenez le $event comme la nouvelle valeur, mais votre objet modèle contient toujours la valeur précédente. Si vous le placez après ngModel le modèle aura déjà la nouvelle valeur.

SOURCE

2 votes

Merci de nous le signaler ! J'ai eu ce problème jusqu'à ce que je trouve votre explication

1 votes

Cela a fait ma journée ! Je ne savais pas que l'ordre de ngModel et ngModelChange changeait le comportement. Merci beaucoup

7voto

Nunien Points 459

1 - (change) est lié à l'événement HTML onchange. La documentation sur le HTML onchange indique ce qui suit :

Exécutez un JavaScript lorsqu'un utilisateur modifie l'option sélectionnée d'une page Web. <select> élément

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

2 - Comme indiqué précédemment, (ngModelChange) est lié à la variable du modèle liée à votre entrée.

Donc, mon interprétation est :

  • (change) se déclenche lorsque le utilisateur modifie l'entrée
  • (ngModelChange) se déclenche lorsque le modèle change, qu'il soit consécutif à une action de l'utilisateur ou non

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X