(เปลี่ยน) vs (ngModelChange) เป็นมุม


326

Angular 1 ไม่ยอมรับonchange()กิจกรรม แต่ยอมรับเฉพาะng-change()กิจกรรม

ในทางกลับกัน 2 ยอมรับทั้งสอง(change)และ(ngModelChange)เหตุการณ์ซึ่งทั้งสองดูเหมือนจะทำสิ่งเดียวกัน

ความแตกต่างคืออะไร?

อันไหนดีที่สุดสำหรับประสิทธิภาพ?

ngModelChange :

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

เทียบกับการเปลี่ยนแปลง :

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

2
ฉันไม่ต้องการเปรียบเทียบสิ่งเหล่านั้น ฉันแค่อยากรู้ว่าอันไหนที่ดีที่สุดสำหรับการแสดง?
Ramesh Rajendran

6
ใช่ไม่มีการเปรียบเทียบ หากคุณใช้ ngModel คุณสามารถใช้ภายหลังได้อย่างแรก เป็นที่ต้องการเสมอเพื่อหลีกเลี่ยง ngModel เนื่องจากเป็นการผูกข้อมูลสองทางจึงไม่ดีต่อประสิทธิภาพ
Vamshi

2
แก้ไขเพื่อให้ความสำคัญกับ "ความแตกต่าง" และ "ซึ่งมีประสิทธิภาพมากกว่า" เพื่อลบผู้กระทำและลงคะแนนให้เปิดใหม่อีกครั้ง
ruffin

12
ใน Angular 7 (ngModelChange) = "eventHandler ()" จะเริ่มก่อนที่ค่าที่ถูกผูกไว้กับ [(ngModel)] = "ค่า" จะถูกเปลี่ยนในขณะที่ (เปลี่ยน) = "eventHandler ()" จะเริ่มทำงานหลังจากที่ค่าถูกผูกไว้ [(ngModel)] = "value" มีการเปลี่ยนแปลง
CAK2

4
โดยวิธีการเหตุการณ์ (เปลี่ยน) ถูกไล่ออกเฉพาะเมื่อโฟกัสออกจากการป้อนข้อมูล หากคุณต้องการให้เกิดเหตุการณ์หลังจากกดปุ่มแต่ละครั้งคุณสามารถใช้เหตุการณ์ (อินพุต)
John Gilmer

คำตอบ:


496

(change) เหตุการณ์ที่ถูกผูกไว้กับเหตุการณ์การเปลี่ยนแปลงอินพุตคลาสสิก

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

คุณสามารถใช้ (เปลี่ยน) เหตุการณ์แม้ว่าคุณจะไม่มีโมเดลที่อินพุตของคุณเป็น

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

(ngModelChange)เป็น@Outputคำสั่งของ ngModel มันจะยิงเมื่อโมเดลเปลี่ยน คุณไม่สามารถใช้เหตุการณ์นี้โดยไม่มีคำสั่ง 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
}

1
จะเกิดอะไรขึ้นถ้าฉันใช้เหตุการณ์การเปลี่ยนแปลงกับวัตถุ ngmodel
Ramesh Rajendran

6
@RameshRajendran ฉันได้ปรับปรุงคำตอบ คุณยังสามารถใช้เหตุการณ์การเปลี่ยนแปลงกับวัตถุ ngModel ได้ แต่การเปลี่ยนเหตุการณ์ผ่านพารามิเตอร์เหตุการณ์เหตุการณ์ ngModelChange จะส่งผ่านค่าใหม่
omeralper

1
ใช่ +1 แต่ฉันมีปัญหากับ ngmodelchange เมื่อคุณล้างค่าทั้งหมดจากกล่องข้อความโดยใช้ ctr + A ดังนั้น ngModelChange จะไม่ทริกเกอร์
Ramesh Rajendran

6
<input (ngModelChange)="modelChanged($event)">ไม่[ngModel]ถูกต้องเป็นสิ่งจำเป็น
e-cloud

3
บางสิ่งบางอย่างคุณไม่สามารถทำได้(change)ในกรณีนี้คุณสามารถทำได้(onClick)="yourFunction(youParameter)"
jpmottin

83

ในเชิงมุม 7 (ngModelChange)="eventHandler()"จะยิงก่อนค่าผูกพันที่จะ[(ngModel)]="value"มีการเปลี่ยนแปลงในขณะที่(change)="eventHandler()"จะยิงหลังจากค่าผูกพันที่จะ[(ngModel)]="value"มีการเปลี่ยนแปลง


1
ฉันเพิ่งทดสอบใน Angular 7.1 และค่าจาก ngModel นั้นได้รับการอัพเดตก่อนที่เหตุการณ์จะถูกเรียก นั่นคือสิ่งที่ฉันใช้
Jahrenski

มันทำงานในเชิงมุม 6 เช่นกัน +1 สำหรับการประหยัดเวลาของฉัน :)
Hemadri Dasari

1
มันเป็นวิธีอื่น ๆ หรือไม่? เอกสาร Angular Dires เริ่มngModelChangeขึ้นหลังจากมุมมองโมเดลอัปเดต
โกรธ

3
ในเอกสารล่าสุดของเชิงมุมกรณีนี้มีการอธิบาย: angular.io/guide/ …
pioro90

4
ใน Angular 7.2 แน่นอนว่า(ngModelChange)เหตุการณ์นั้นเกิดขึ้นก่อนที่ค่าจะเปลี่ยนแปลงและ(change) หลังจากที่มีการเปลี่ยนแปลง ขอบคุณสำหรับข้อมูลที่มีประโยชน์สุด ๆ !
Dennis Ameling

15

ตามที่ฉันได้พบและเขียนในหัวข้ออื่น - สิ่งนี้ใช้กับเชิงมุม <7 (ไม่แน่ใจว่ามันเป็นอย่างไรใน 7+)

เพียงเพื่ออนาคต

เราจำเป็นที่จะสังเกตเห็นว่า[(ngModel)]="hero.name"เป็นเพียงการตัดสั้นที่สามารถ de-sugared [ngModel]="hero.name" (ngModelChange)="hero.name = $event"ไปที่:

ดังนั้นถ้าเราทำ de-sugar code เราจะได้:

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

หรือ

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

หากคุณตรวจสอบรหัสข้างต้นคุณจะสังเกตเห็นว่าเราจบลงด้วย 2 ngModelChangeเหตุการณ์และสิ่งเหล่านั้นจะต้องถูกดำเนินการในบางลำดับ

สรุป: ถ้าคุณวางไว้ngModelChangeก่อนหน้าngModelนี้คุณจะได้รับ$eventค่าใหม่ แต่วัตถุจำลองของคุณยังคงมีค่าก่อนหน้า หากคุณวางไว้หลังจากngModelนั้นโมเดลจะมีค่าใหม่แล้ว

แหล่งที่มา


ขอบคุณสำหรับการชี้ให้เห็น! ฉันมีปัญหานี้จนกระทั่งพบคำอธิบายของคุณ
omostan

2

1 - (change)ถูกผูกไว้กับเหตุการณ์การเปลี่ยน HTML เอกสารเกี่ยวกับ HTML onchange กล่าวดังนี้:

เรียกใช้งาน JavaScript เมื่อผู้ใช้เปลี่ยนตัวเลือกที่เลือกไว้ของ<select>องค์ประกอบ

ที่มา: https://www.w3schools.com/jsref/event_onchange.asp

2 -ตามที่ระบุไว้ก่อนหน้า(ngModelChange)นี้ถูกผูกไว้กับตัวแปรโมเดลที่เชื่อมโยงกับอินพุตของคุณ

ดังนั้นการตีความของฉันคือ:

  • (change)ทริกเกอร์เมื่อผู้ใช้เปลี่ยนอินพุต
  • (ngModelChange) เรียกใช้เมื่อโมเดลเปลี่ยนแปลงไม่ว่าจะเป็นแบบต่อเนื่องกับแอ็คชันของผู้ใช้หรือไม่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.