(thay đổi) so với (ngModelChange) trong góc


326

Angular 1 không chấp nhận onchange()sự kiện, nó chỉ chấp nhận ng-change()sự kiện.

Angular 2, mặt khác, chấp nhận cả hai (change)(ngModelChange)các sự kiện, mà cả hai dường như đang làm điều tương tự.

Có gì khác biệt?

cái nào là tốt nhất cho hiệu suất?

ngModelChange :

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

vs sự thay đổi :

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

2
Tôi không muốn so sánh chúng. Tôi chỉ muốn biết cái nào là tốt nhất cho hiệu suất?
Ramesh Rajendran

6
Vâng, không có so sánh. Nếu bạn đang sử dụng ngModel, bạn có thể sử dụng cái sau nếu không cái đầu tiên. Luôn luôn ưu tiên tránh ngModel vì đó là ràng buộc dữ liệu hai chiều, do đó không tốt cho hiệu suất
Vamshi

2
Đã chỉnh sửa để nhấn mạnh vào "sự khác biệt" và "cái nào hiệu quả hơn" để loại bỏ tính chủ quan & bỏ phiếu để mở lại.
ruffin

12
Trong Angular 7, (ngModelChange) = "eventHandler ()" sẽ bắn TRƯỚC giá trị được ràng buộc với [(ngModel)] = "value" được thay đổi trong khi (change) = "eventHandler ()" sẽ bắn SAU giá trị được ràng buộc với [(ngModel)] = "value" được thay đổi.
CAK2

4
Nhân tiện, sự kiện (thay đổi) chỉ được kích hoạt khi tiêu điểm rời khỏi đầu vào. Nếu bạn muốn một sự kiện được kích hoạt sau mỗi lần bấm phím, bạn có thể sử dụng sự kiện (đầu vào).
John Gilmer

Câu trả lời:


496

(change) sự kiện ràng buộc với sự kiện thay đổi đầu vào cổ điển.

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

Bạn có thể sử dụng (thay đổi) sự kiện ngay cả khi bạn không có mô hình ở đầu vào của mình như

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

(ngModelChange)@Outputchỉ thị của ngModel. Nó kích hoạt khi mô hình thay đổi. Bạn không thể sử dụng sự kiện này mà không có chỉ thị ngModel.

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

Khi bạn khám phá thêm trong mã nguồn, (ngModelChange)sẽ phát ra giá trị mới.

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

Vì vậy, nó có nghĩa là bạn có khả năng sử dụng như vậy:

<input (ngModelChange)="modelChanged($event)">
modelChanged(newObj) {
    // do something with new value
}

Về cơ bản, có vẻ như không có sự khác biệt lớn giữa hai, nhưng ngModelcác sự kiện đạt được sức mạnh khi bạn sử dụng [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
}

giả sử bạn thử điều tương tự mà không có " ngModelđiều"

<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
Điều gì sẽ xảy ra nếu tôi đang sử dụng sự kiện thay đổi với đối tượng ngmodel?
Ramesh Rajendran

6
@RameshRajendran Tôi đã cải thiện câu trả lời. Bạn vẫn có thể sử dụng sự kiện thay đổi với đối tượng ngModel, nhưng thay đổi sự kiện vượt qua tham số sự kiện, sự kiện ngModelChange chuyển giá trị mới.
omiefper

1
Vâng +1. Nhưng tôi có một vấn đề với ngmodelchange, khi bạn xóa tất cả các giá trị khỏi hộp văn bản bằng cách sử dụng ctr + A. thì ngModelChange không kích hoạt.
Ramesh Rajendran

6
<input (ngModelChange)="modelChanged($event)">là không đúng, [ngModel]là bắt buộc.
đám mây điện tử

3
Một cái gì đó, bạn không thể làm một (change), trong trường hợp này, bạn có thể làm một(onClick)="yourFunction(youParameter)"
jpmottin

83

Trong Angular 7, ý (ngModelChange)="eventHandler()"chí sẽ bắn trước khi giá trị bị ràng buộc bị [(ngModel)]="value"thay đổi trong khi ý (change)="eventHandler()"chí sẽ bắn sau khi giá trị bị ràng buộc bị [(ngModel)]="value"thay đổi.


1
Tôi vừa thử nghiệm trong Angular 7.1 và giá trị từ ngModel được cập nhật trước khi sự kiện được gọi. Vì vậy, đó là những gì tôi sử dụng
Jahrenski

Nó làm việc trong góc 6 là tốt. +1 để tiết kiệm thời gian của tôi :)
Hemadri Dasari

1
Không phải nó là cách khác sao? Theo Angular Docs ngModelChange cháy sau khi cập nhật mô hình xem.
cơn thịnh nộ

3
Trong tài liệu mới nhất về góc, trường hợp này được mô tả: angular.io/guide/,
pioro90

4
Trong Angular 7.2, thực (ngModelChange)sự sự kiện được kích hoạt trước khi giá trị được thay đổi và (change) sau khi nó đã thay đổi. Cảm ơn thông tin, siêu hữu ích!
Dennis Ameling

15

Như tôi đã tìm thấy và viết trong một chủ đề khác - điều này áp dụng cho góc <7 (không chắc nó như thế nào trong 7+)

Chỉ vì tương lai

chúng ta cần quan sát rằng đó [(ngModel)]="hero.name"chỉ là một đoạn ngắn có thể được khử thành : [ngModel]="hero.name" (ngModelChange)="hero.name = $event".

Vì vậy, nếu chúng tôi khử mã đường, chúng tôi sẽ kết thúc với:

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

hoặc là

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

Nếu bạn kiểm tra mã trên, bạn sẽ nhận thấy rằng chúng tôi kết thúc với 2 ngModelChangesự kiện và những sự kiện đó cần được thực hiện theo một số thứ tự.

Tóm tắt: Nếu bạn đặt ngModelChangetrước ngModel, bạn sẽ nhận được $eventgiá trị mới, nhưng đối tượng mô hình của bạn vẫn giữ giá trị trước đó. Nếu bạn đặt nó sau ngModel, mô hình sẽ có giá trị mới.

NGUỒN


Cảm ơn bạn đã chỉ ra điều này! Tôi đã có vấn đề này cho đến khi tôi tìm thấy lời giải thích của bạn
omostan

2

1 - (change) bị ràng buộc với sự kiện trao đổi HTML. Tài liệu về HTML onchange cho biết như sau:

Thực thi JavaScript khi người dùng thay đổi tùy chọn đã chọn của một <select>phần tử

Nguồn: https://www.w3schools.com/jsref/event_onchange.asp

2 - Như đã nêu trước đây, (ngModelChange)bị ràng buộc với biến mô hình được liên kết với đầu vào của bạn.

Vì vậy, cách giải thích của tôi là:

  • (change)kích hoạt khi người dùng thay đổi đầu vào
  • (ngModelChange) kích hoạt khi mô hình thay đổi, cho dù nó liên tiếp đến hành động của người dùng hay không
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.