Angular 2 ngModelИзменить старое значение

Может кто-нибудь, пожалуйста, скажите мне, что является лучшей практикой для сравнения старого и нового значения ngModel?

В angular 1:

$scope.$watch('someProperty', funciton(oldVal, newVal){
    // code goes here
})

Я спрашиваю об этом, потому что (ngModelChange) никогда не приносит мне oldVal, только newVal.

В моем случае я использую ngModel в теге <select> и сравниваю старый выбор с новым:

<select [(ngModel)]="current" (ngModelChange)="onModelChange($event)">
     <option *ngFor="let item of myArray" [ngValue]="item">{{item.name}} </option>
</select>

Ответ 1

Это может работать

(ngModelChange)="onModelChange(oldVal, $event); oldVal = $event;"

или

(ngModelChange)="onModelChange($event)"
oldValue:string;
onModelChange(event) {
  if(this.oldValue != event) {
    ...
  }
  this.oldValue = event;
}

Ответ 2

Пример с полем ввода...

<div *ngFor="let value of values">{{value}}
    <input [(ngModel)]="value" (focus)="old=value" (ngModelchange)="doSomething(old, value)">
</div>

doSomething(oldVal, newVal) {
    // some code
}

Ответ 3

Просто на будущее

мы должны заметить, что [(ngModel)] = "hero.name" - это просто кратчайший путь, который можно удалить с нуля: [ngModel] = "hero.name" (ngModelChange) = "hero.name = $ event ".

Так что, если мы удалим код из сахара, мы получим:

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

или же

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

Если вы осмотрите вышеприведенный код, вы заметите, что в итоге мы имеем 2 события ngModelChange, которые должны быть выполнены в некотором порядке.

Подведение итогов: если вы поместите ngModelChange перед ngModel, вы получите событие $ как новое значение, но ваш объект модели все еще будет иметь предыдущее значение. Если вы поместите его после ngModel, модель уже будет иметь новое значение.

ИСТОЧНИК