(change) vs (ngModelChange) 角度

IT技术 javascript html angular typescript angular-ngmodelchange
2021-02-06 13:28:29

Angular 1 不接受onchange()事件,它只接受ng-change()事件。

另一方面,Angular 2 接受(change)(ngModelChange)事件,这两者似乎都在做同样的事情。

有什么不同?

哪一种最适合性能?

ngModelChange

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

VS变化

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

(change) 事件绑定到经典输入更改事件。

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

即使您的输入中没有模型,您也可以使用 (change) 事件作为

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

(ngModelChange)@OutputngModel 指令。当模型改变时它会触发。如果没有 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
}
<input (ngModelChange)="modelChanged($event)">是不对的,[ngModel]是必须的。
2021-03-14 13:28:29
如果我对 ngmodel 对象使用 change 事件会发生什么?
2021-03-17 13:28:29
@RameshRajendran 我改进了答案。您仍然可以将更改事件与 ngModel 对象一起使用,但更改事件传递事件参数,ngModelChange 事件传递新值。
2021-03-24 13:28:29
有些事情,你不能做一个(change),在这种情况下,你可以做一个(onClick)="yourFunction(youParameter)"
2021-03-24 13:28:29
是的+1。但是我对 ngmodelchange 有问题,当您使用 ctr + A 清除文本框中的所有值时,ngModelChange 不会触发。
2021-03-31 13:28:29

在角7时,(ngModelChange)="eventHandler()"将触发之前绑定到值[(ngModel)]="value"而改变(change)="eventHandler()"会触发绑定值[(ngModel)]="value"被改变。

在 angular 的最新文档中描述了这种情况:angular.io/guide/...
2021-03-12 13:28:29
我刚刚在 Angular 7.1 中进行了测试,并且在调用事件之前更新了来自 ngModel 的值。所以这就是我使用的
2021-04-03 13:28:29
在 Angular 7.2 中,确实在值更改之前和更改之后(ngModelChange)触发事件谢谢你的信息,超级有帮助!(change)
2021-04-04 13:28:29
不是反过来吗?根据 Angular Docs ngModelChange在视图模型更新后触发。
2021-04-05 13:28:29
为什么有人希望在绑定到模型的值发生变化之前触发一个函数?
2021-04-10 13:28:29

正如我在另一个主题中找到并写的那样- 这适用于 angular < 7(不确定它在 7+ 中如何)

只为未来

我们需要观察的是[(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事件,并且这些事件需要按某种顺序执行。

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

来源

ngModel 和 ngModelChange 的顺序仍然与 angular 10+ 相关。多么糟糕的问题!
2021-03-14 13:28:29
怎么是hero.name = $event又不是hero.name = $event.value
2021-03-19 13:28:29
这件事情让我感到很快乐!。我不知道 ngModel 和 ngModelChange 使行为改变的顺序。非常感谢
2021-04-04 13:28:29
对不起,我的意思是$event.target.value而不是$event.value
2021-04-09 13:28:29
感谢您指出这一点!我遇到了这个问题,直到我找到你的解释
2021-04-11 13:28:29

1 - (change)绑定到 HTML onchange 事件。关于 HTML onchange 的文档说明如下:

当用户更改<select>元素的选定选项时执行 JavaScript

来源:https : //www.w3schools.com/jsref/event_onchange.asp

2 -如前所述,(ngModelChange)绑定到绑定到您输入的模型变量。

所以,我的解释是:

  • (change)用户改变输入时触发
  • (ngModelChange) 当模型更改时触发,无论它是否与用户操作连续

根据我的经验(change)(ngModelChange)有两种不同的用法。

  1. (ngModelChange) 当 HTML 呈现时触发,用户更改了该元素的值。

  2. (change) 当用户更改值并离开元素焦点时触发。

用法:

  1. (ngModelChange):当您有关键的事情依赖于 html 时,您必须处理任何类型的更改。
  2. (change):当您只需要处理用户所做的值更改时。

注意:使用 时要小心,(ngModelChange)因为有时它会给您带来最大的调用堆栈问题,并且您的表单会卡住。

这也是我从测试中了解到的。这非常重要,因为如果您想减少开销,您可以使用更改,因为它仅在用户离开输入焦点并且发生更改时触发。谢谢。
2021-03-17 13:28:29
正确,感谢评论这将有助于其他人理解
2021-04-06 13:28:29