Angular 2 ngModelChange 旧值

Posted

技术标签:

【中文标题】Angular 2 ngModelChange 旧值【英文标题】:Angular 2 ngModelChange old value 【发布时间】:2017-05-23 11:34:06 【问题描述】:

谁能告诉我比较 ngModel 新旧值的最佳做法是什么?

角度 1:

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

我问这个是因为(ngModelChange) 从来没有给我带来oldVal,只有newVal

就我而言,我在 <select> 标记中使用 ngModel 并将旧选择与新选择进行比较:

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

【问题讨论】:

【参考方案1】:

输入字段示例...

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

doSomething(oldVal, newVal) 
    // some code

【讨论】:

我在 【参考方案2】:

这可能有效

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

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

【讨论】:

我试过了,但 oldVal 参数未定义。我在 只需在组件类中声明一个具有此名称的变量即可。我将它添加到我的代码中(在第二个示例中) 好的,我现在明白了。但是这个解决方案似乎非常手动,你确定这是最佳做法吗? Angular 2 没有提供任何东西来获取 oldVal? 不,Angular 只提供$event,或者如果您使用[ngModel]="myValue",则使用新值更新myValue 属性。如果您使用[myProp]="someValue" 绑定到@Input() myProp;,那么当绑定更新ngOnChanges(changes) 时,changes 也包含旧值,但这不适用于您的情况,它仅适用于来自父级的绑定给孩子。 在我的例子中,选择值已经设置好了,所以this.oldValue的值是undefined,因为onModelChange将是第一次运行。是否也有解决方法?【参考方案3】:

只为未来

我们需要观察到 [(ngModel)]="hero.name" 只是一个捷径,可以脱糖为: [ngModel]="hero.name" (ngModelChange)="hero.name = $事件”。

因此,如果我们对代码进行去糖化处理,我们最终会得到:

&lt;select (ngModelChange)="onModelChange()" [ngModel]="hero.name" (ngModelChange)="hero.name = $event"&gt;

&lt;[ngModel]="hero.name" (ngModelChange)="hero.name = $event" select (ngModelChange)="onModelChange()"&gt;

如果您检查上面的代码,您会注意到我们最终得到了 2 个 ngModelChange 事件,并且这些事件需要按某种顺序执行。

总结:如果你把 ngModelChange 放在 ngModel 之前,你会得到 $event 作为新值,但你的模型对象仍然保持以前的值。 如果你把它放在 ngModel 之后,模型就已经有了新的值。

SOURCE

示例堆栈闪电战: https://stackblitz.com/edit/angular-ivy-zlhwex

【讨论】:

以上是关于Angular 2 ngModelChange 旧值的主要内容,如果未能解决你的问题,请参考以下文章

[Angular]关于ngModel与ngModelChange

将组件拆分成更小的组件,同时保持 Angular 中父组件的 `ngModel` 和 `ngModelChange` 绑定

为啥在下拉列表中加载组件时不会触发 ngmodelChange 事件?

Angular4 Select选择改变事件的方法

Angular 2设置选择的开始值[重复]

ngModelChange 如何在 ngModel 指令中不提供模型名称的情况下工作