(изменить) против (ngModelChange) в угловых

135

Angular 1 не принимает событие onchange, но принимает только событие ng-change.

Angular 2, с другой стороны, принимает оба события (change) и (ngModelChange), которые, похоже, выполняют одно и то же.

Какая разница?

какой из них лучше для производительности?

ngModelChange:

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

против изменения:

<input type="text" pInputText class="ui-widget ui-text" 
    (change)="clearFilter()" placeholder="Find"/>
  • 1
    Если вы хотите сравнить два из них, возможно, вы также можете добавить (change) и (keyup)
  • 1
    Я не хочу сравнивать их. Я просто хочу знать, какой из них лучше для производительности?
Показать ещё 3 комментария
Теги:
angular

2 ответа

255
Лучший ответ

(change) событие, связанное с классическим событием изменения ввода.

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

Вы можете использовать (изменить) событие, даже если у вас нет модели на вашем входе, поскольку

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

(ngModelChange) - это @Output директивы ngModel. Он срабатывает при изменении модели. Вы не можете использовать это событие без директивы ngModel.

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

Как вы узнаете больше в исходном коде, (ngModelChange) испускает новое значение.

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

Итак, это означает, что у вас есть возможность такого использования:

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

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

В принципе, кажется, что нет большой разницы между двумя, но ngModel события набирают силу, когда вы используете [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
}

Предположим, вы пытаетесь сделать то же самое без "ngModel вещей"

<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
    Что произойдет, если я использую событие change с объектом ngmodel?
  • 6
    @RameshRajendran Я улучшил ответ. Вы все еще можете использовать событие change с объектом ngModel, но событие change передает параметр события, событие ngModelChange передает новое значение.
Показать ещё 6 комментариев
5

В Angular 7 (ngModelChange)="eventHandler()" сработает до изменения значения, связанного с [(ngModel)]="value" а (change)="eventHandler()" сработает после значения, связанного с [(ngModel)]="value" изменено.

  • 1
    Я только что проверил в Angular 7.1 и значение из ngModel обновляется до вызова события. Так вот что я использую
  • 0
    Это работало в угловых 6 также. +1 за экономию моего времени :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню