جافاسكريبت - (change) مقابل (ngModelChange) في أنغولار
Angular 1 لا يقبل حدث onchange()، فهو يقبل فقط حدث ng-change().
من ناحية أخرى، يقبل Angular 2 كل من أحداث (change) و (ngModelChange)، وكلاهما يبدو أنه يقوم بنفس الشيء.
ما الفرق؟
أي واحد هو الأفضل من حيث الأداء؟
تغيير نموذج ngModel:
<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"/>
الإجابة رقم 1
حدث (change) مرتبط بحدث تغيير الإدخال الكلاسيكي.
https://developer.mozilla.org/en-US/docs/Web/Events/change
يمكنك استخدام حدث (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
}
الإجابة رقم 2
في Angular 7، ستنفذ (ngModelChange)="eventHandler()" قبل تغيير القيمة المرتبطة بـ [(ngModel)]="value" بينما ستنفذ (change)="eventHandler()" بعد تغيير القيمة المرتبطة بـ [(ngModel)]="value".
الإجابة رقم 3
كما وجدت وكتبت في موضوع آخر - هذا ينطبق على 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()">إذا قمت بفحص الكود أعلاه، ستلاحظ أننا سننتهي بحدثين ngModelChange ويجب تنفيذهما بترتيب معين.
الخلاصة: إذا وضعت ngModelChange قبل ngModel، ستحصل على $event بالقيمة الجديدة، لكن كائن النموذج الخاص بك لا يزال يحمل القيمة السابقة. إذا قمت بوضعه بعد ngModel، سيكون النموذج قد حصل بالفعل على القيمة الجديدة.
المصدر
الإجابة رقم 4
1 - (change) مرتبط بحدث onchange في HTML. تقول الوثائق حول onchange في HTML ما يلي :
تشغيل جافا سكريبت عندما يغير المستخدم الخيار المحدد لعنصر
<select>
المصدر: https://www.w3schools.com/jsref/event_onchange.asp
2 - كما ذكرنا سابقًا، (ngModelChange) مرتبط بمتغير النموذج المرتبط بإدخالك.
إذاً، تفسيري هو :
(change)يُفعّل عندما يقوم المستخدم بتغيير الإدخال(ngModelChange)يتم تفعيله عند تغير النموذج، سواء كان ذلك نتيجة لتفاعل المستخدم أو لا
الإجابة رقم 5
حسب خبرتي، (change) و (ngModelChange) لهما استخدامان مختلفان.
يتم تفعيل
(ngModelChange)عند عرض HTML، وعندما يغير المستخدم قيمة هذا العنصر.يتم تشغيل
(change)عندما يغير المستخدم القيمة ويغادر عنصر التركيز.
الاستخدام :
(ngModelChange): عندما يكون لديك أشياء حرجة تعتمد على HTML، يجب التعامل مع أي نوع من التغييرات التي تحدث.(التغيير): عندما تحتاج إلى التعامل مع تغييرات القيم التي يقوم بها المستخدم فقط.
ملاحظة: كن حذراً عند استخدام (ngModelChange) لأنه أحيانًا قد يسبب لك مشكلة الحد الأقصى لمكدس الاستدعاءات وسيتوقف النموذج الخاص بك عن العمل.
