açısal olarak (değiştir) vs (ngModelChange)


326

Açısal 1 onchange()etkinliği kabul etmez , yalnızca kabul ederng-change() etkinliği .

2 Eğik, diğer taraftan, hem kabul (change)ve (ngModelChange)her ikisi de aynı şeyi yapıyor gibi görünüyor, olaylar.

Fark ne?

hangisi performans için en iyisidir?

ngModelDeğiştir :

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

vs değişiklik :

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

2
Bunları karşılaştırmak istemiyorum. Sadece hangisinin performans için en iyi olduğunu bilmek istiyorum?
Ramesh Rajendran

6
Evet, karşılaştırma yok. NgModel kullanıyorsanız daha sonra ilkini kullanabilirsiniz. İki yönlü veri bağlama olduğundan ngModel'den kaçınmak her zaman tercih edilir, bu nedenle performans için kötü
Vamshi

2
Öznellikten kurtulmak için "fark nedir" ve "hangisi daha performanslıdır" üzerine vurgu yapmak için düzenlenmiş ve yeniden açmaya oy vermiştir.
ruffin

12
Açısal 7'de, (ngModelChange) = "eventHandler ()", [(ngModel)] = "değer" değerine bağlı ÖNCE tetiklenirken (change) = "eventHandler ()", değere bağlı değerden SONRA tetiklenir [(ngModel)] = "değer" değiştirildi.
CAK2

4
Bu arada, (change) olayı yalnızca odak girişten çıktığında tetiklenir. Her tuşa basıldıktan sonra bir olayın başlatılmasını istiyorsanız, (input) etkinliğini kullanabilirsiniz.
John Gilmer

Yanıtlar:


496

(change) klasik girdi değiştirme olayına bağlı olay.

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

Girişinizde bir model olmasa bile olayı (değiştir) kullanabilirsiniz.

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

(ngModelChange) bu @Output ngModel direktifin. Model değiştiğinde ateşlenir. Bu olayı ngModel yönergesi olmadan kullanamazsınız.

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

Kaynak kodda daha fazlasını keşfettiğinizde, (ngModelChange) yeni değeri yayar.

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

Yani bu tür bir kullanım yeteneğiniz var demektir:

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

Temel olarak, ikisi arasında büyük bir fark yok gibi görünüyor, ancak ngModelolaylar kullandığınızda güç kazanıyor [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
}

aynı şeyi " ngModelşeyler" olmadan denediğinizi varsayalım

<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 nesnesiyle change olayı kullanıyorsam ne olur?
Ramesh Rajendran

6
@RameshRajendran Cevabı geliştirdim. Yine de ngModel nesnesiyle change olayını kullanabilirsiniz, ancak change olayı olay parametresini geçer, ngModelChange olayı yeni bir değer geçirir.
omeralper

1
Evet +1. Ama ctr + A kullanarak metin kutusundaki tüm değerleri temizlediğinizde ngmodelchange ile ilgili bir sorunum var, sonra ngModelChange tetiklemiyor.
Ramesh Rajendran

6
<input (ngModelChange)="modelChanged($event)">doğru değil [ngModel], gerekli.
e-bulut

3
Bir şey yapamazsın (change), bu durumda, yapabilirsin(onClick)="yourFunction(youParameter)"
jpmottin

83

Açısal 7'de, (ngModelChange)="eventHandler()"ateş edeceği önce bağlı değer [(ngModel)]="value"ise değiştirilir (change)="eventHandler()"irade yangın sonrasında bağlı değere [(ngModel)]="value"değiştirilir.


1
Açısal 7.1'de test ettim ve ngModel'den gelen değer, olay çağrılmadan önce güncellenir. Ben de bunu kullanıyorum
Jahrenski

Açısal 6'da da çalıştı.
Zamanımı

1
Bunun tersi değil mi? Açısal Dokümanlar göre ngModelChangegörünüm modeli güncellemeleri sonra ateş.
öfke

3
Açısal son belgelerde bu durum açıklanmaktadır: angular.io/guide/...
pioro90

4
Açısal 7.2'de (ngModelChange)olay gerçekten değer değiştirilmeden önce ve değiştirildikten (change) sonra tetiklenir . Bilgi için teşekkürler, süper yararlı!
Dennis Ameling

15

Ben buldum ve yazdığı gibi başka konuda - bu açısal <7 için geçerlidir (7+ içinde nasıl olduğundan emin değilim)

Sadece gelecek için

bunun [(ngModel)]="hero.name"şekersizleştirilebilecek bir kısa yol olduğunu gözlemlememiz gerekir :[ngModel]="hero.name" (ngModelChange)="hero.name = $event" .

Yani eğer şekeri kaldırırsak aşağıdakilerle sonuçlanırdık:

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

veya

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

Yukarıdaki kodu incelerseniz, 2 ile sonuçlandığımızı göreceksiniz. ngModelChange olayla ve bunların bir sırayla yürütülmesi gerektiğini .

Özetle: Daha ngModelChangeönce yerleştirirseniz , yeni değeri ngModelalırsınız $event, ancak model nesneniz yine de önceki değeri tutar. Sonra yerleştirirseniz ngModel, model zaten yeni değere sahip olacaktır.

KAYNAK


Bunu işaret ettiğiniz için teşekkür ederiz! Açıklamanızı bulana kadar bu sorunu yaşadım
omostan

2

1 - (change) HTML değişim etkinliğine bağlıdır. HTML değiştirmeyle ilgili belgeler şunları söylüyor:

Kullanıcı bir <select>öğenin seçili seçeneğini değiştirdiğinde JavaScript çalıştırma

Kaynak: https://www.w3schools.com/jsref/event_onchange.asp

2 - Daha önce belirtildiği gibi (ngModelChange), girişinize bağlanan model değişkenine bağlıdır.

Benim yorumum:

  • (change)kullanıcı girişi değiştirdiğinde tetiklenir
  • (ngModelChange) model bir kullanıcı işlemine ardışık olsun veya olmasın, değiştiğinde tetiklenir
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.