مقدمة: لماذا هذا الموضوع يفجر Stack Overflow؟
\n\nإذا كنت قد كتبت أي وقت مضى في Angular وواجهت معالجة التغييرات في <input>، فمن المؤكد أنك رأيت حدثين متشابهين: (change) و (ngModelChange). للوهلة الأولى - نفس الشيء. في الواقع - الشيطان يكمن في التفاصيل. السؤال "(change) vs (ngModelChange) in Angular" يجمع آلاف المشاهدات على Stack Overflow، وليس من دون سبب: الاختيار الخاطئ يؤدي إلى أخطاء، وطلبات زائدة للخادم، وليالٍ بلا نوم.
في هذه المقالة على PythonLib سنوضح مرة واحدة وإلى الأبد:
\n- \n
- ما الفرق بين
(change)و(ngModelChange)في Angular؟ \n - متى تستخدم كل منهما؟ \n
- كيف تتجنب الأخطاء الشائعة؟ \n
هيا بنا! 🚀
\n\nباختصار: ما هما (change) و (ngModelChange)؟
\n\n(change) - هو حدث DOM قياسي يتم تشغيله عندما يفقد العنصر التركيز (blur) وتتغير قيمته. يقوم Angular ببساطة بتغليف حدث change الأصلي.
(ngModelChange) - هو حدث من توجيه ngModel. يتم تشغيله في كل مرة يتغير فيها النموذج - حرفيًا عند كل ضغطة مفتاح (إذا لم يتم استخدام ngModelOptions).
هام: لا يمكن استخدام\n\nngModelChangeبدون[(ngModel)]. إنه جزء من الربط ثنائي الاتجاه.
إليك مثال بسيط باستخدام TypeScript لرؤية الفرق:
\n\n// app.component.ts\nimport { Component } from '@angular/core';\n\n@Component({\n selector: 'app-root',\n template: `\n <input\n [ngModel]="name"\n (ngModelChange)="onNgModelChange($event)"\n (change)="onChange($event)"\n placeholder="أدخل الاسم">\n <p>القيمة: {{ name }}</p>\n `\n})\nexport class AppComponent {\n name = '';\n\n onNgModelChange(value: string) {\n console.log('ngModelChange:', value);\n }\n\n onChange(event: Event) {\n console.log('change:', (event.target as HTMLInputElement).value);\n }\n}\n\n\nجرب إدخال "Angular" - وسترى: ngModelChange سيتم تشغيله 7 مرات (لكل حرف)، بينما change سيتم تشغيله مرة واحدة فقط عند النقر خارج الحقل.
الاختلافات الرئيسية: جدول مقارنة
\n\nلتوضيح الأمر، إليك جدول الاختلافات الرئيسية (change) vs (ngModelChange):
\n\n| المعيار | \n(change) | \n(ngModelChange) | \n
|---|---|---|
| نوع الحدث | \nحدث DOM أصلي | \nحدث Angular (EventEmitter) | \n
| متى يتم تشغيله | \nعند فقدان التركيز + تغيير القيمة | \nعند كل تغيير في النموذج (كل إدخال) | \n
| القيمة في $event | \nكائن Event (يجب استخراج value) | \nالقيمة الجديدة للنموذج (نص، رقم، إلخ) | \n
| الاعتماد على ngModel | \nغير مطلوب (يمكن استخدامه على أي input) | \nيتطلب [(ngModel)] أو [ngModel] | \n
| الأداء | \nعالٍ (يتم تشغيله نادرًا) | \nقد يكون متكررًا (عند كل ضغطة مفتاح) | \n
| الاستخدام مع النماذج | \nالنماذج التفاعلية، النماذج المبنية على القوالب | \nفقط النماذج المبنية على القوالب | \n
متى تستخدم (change)؟
\n\n(change) - هو اختيارك إذا:
\n- \n
- تحتاج إلى التفاعل فقط عندما يغادر المستخدم الحقل