(更改)vs(ngModelChange)的角度

Ram*_*ran 255 html javascript typescript angular angular-ngmodelchange

Angular 1不接受onchange事件,但只接受onchange()事件.

另一方面,Angular 2接受两者ng-change()和(change)事件,它们似乎都在做同样的事情.

有什么不同?

哪一个最适合表现?

ngModelChange:

<input type="text" pInputText class="ui-widget ui-text"
    (ngModelChange)="clearFilter()" placeholder="Find"/>
Run Code Online (Sandbox Code Playgroud)

与变化:

<input type="text" pInputText class="ui-widget ui-text" 
    (change)="clearFilter()" placeholder="Find"/>
Run Code Online (Sandbox Code Playgroud)

ome*_*per 398

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

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

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

<input (change)="somethingChanged()">
Run Code Online (Sandbox Code Playgroud)

(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)">
Run Code Online (Sandbox Code Playgroud)

基本上,似乎两者之间没有太大的区别,但ngModel事件在你使用时会获得力量[ngValue].

modelChanged(newObj) {
    // do something with new value
}
Run Code Online (Sandbox Code Playgroud)

假设你没有" ngModel事物" 尝试同样的事情

  <select [(ngModel)]="data" (ngModelChange)="dataChanged($event)" name="data">
      <option *ngFor="let currentData of allData" [ngValue]="currentData">
          {{data.name}}
      </option>
  </select>
Run Code Online (Sandbox Code Playgroud)

  • @RameshRajendran我改进了答案.您仍然可以将更改事件与ngModel对象一起使用,但更改事件传递事件参数,ngModelChange事件传递新值. (6认同)
  • `<input(ngModelChange)="modelChanged($ event)">`不对,`[ngModel]`是必需的. (5认同)
  • 有些东西,你不能做`(改变)`,在这种情况下,你可以做一个`(onClick)="yourFunction(youParameter)"` (3认同)

CAK*_*AK2 57

在Angular 7中,(ngModelChange)="eventHandler()"将在[(ngModel)]="value"更改值绑定之前触发,将在更改绑定值之后(change)="eventHandler()"触发.[(ngModel)]="value"

  • 在有关angular的最新文档中,描述了这种情况:https://angular.io/guide/forms-overview#data-flow-in-template-driven-forms (3认同)
  • 为什么有人希望在绑定到模型的值发生更改之前触发函数? (3认同)
  • 在Angular 7.2中,确实在值更改之前(在更改之前)触发了(ngModelChange)事件,在值更改之后(在更改之后)触发了((change)`事件。感谢您提供的信息,超级有帮助! (2认同)

Dis*_*ter 37

正如我在另一个主题中找到并写的那样- 这适用于 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 的顺序会导致行为改变。多谢 (3认同)
  • 感谢您指出这一点!我遇到了这个问题,直到我找到你的解释 (2认同)

Vip*_*oni 13

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

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

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

用法:

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

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


Jul*_*ien 11

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

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

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

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

所以,我的解释是:

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