مقدمة: لماذا يصرخ نموذج Angular الخاص بك بخطأ؟
\nهل سبق لك أن واجهت موقفًا: تكتب نموذجًا جميلاً باستخدام Angular Material، ويبدو كل شيء مثاليًا، ولكن فجأة تظهر وحدة تحكم المتصفح رسالة:
\nmat-form-field must contain a MatFormFieldControl\nأو، إذا كنت تستخدم الوضع الصارم لـ TypeScript، فقد يظهر شيء مثل:
\nError: mat-form-field must contain a MatFormFieldControl. Did you forget to add a directive that implements MatFormFieldControl?\nهذا أحد أشهر الأخطاء على Stack Overflow (آلاف المشاهدات!)، واليوم سنقوم بتحليله بالكامل. ستتعلم ليس فقط كيفية إصلاح هذه المشكلة، ولكن أيضًا لماذا تحدث. والأهم من ذلك، ستتعلم كيفية إنشاء عناصر التحكم الخاصة بك لـ Angular Material، إذا كان MatInput القياسي لا يناسبك.
هيا بنا! 🚀
\n\nما هو MatFormFieldControl ولماذا هو مطلوب؟
\nقبل معالجة الخطأ، دعنا نفهم تشريح Angular Material. mat-form-field هو حاوية تضيف تنسيق Material Design (تسمية، تسطير، تلميحات، أخطاء). لكنه في حد ذاته لا يعرض أي شيء. يحتاج إلى "طفل" - توجيه أو مكون يقوم بتنفيذ الواجهة MatFormFieldControl.
تصف هذه الواجهة (أو الفئة المجردة) كيفية تفاعل عنصر التحكم مع النموذج: كيفية الحصول على القيمة، وكيفية إظهار الخطأ، وكيفية معالجة التركيز. التنفيذ القياسي هو MatInput. إذا كتبت:
<mat-form-field>\n <input matInput placeholder="الاسم">\n</mat-form-field>\n— فإن التوجيه matInput يقوم تلقائيًا بتنفيذ MatFormFieldControl.
يحدث الخطأ عندما لا يعثر Angular على أي عنصر فرعي بهذا التنفيذ. على سبيل المثال:
\n<mat-form-field>\n <input placeholder="الاسم"> <!-- لا يوجد matInput! -->\n</mat-form-field>\nأو عندما تحاول استخدام مكون مخصص لم يقم بتوصيل الواجهة.
\n\nالأسباب النموذجية للخطأ (وكيفية إصلاحها)
\n\n1. نسيت إضافة التوجيه matInput
\nالسبب الأكثر تافهًا. أنت ببساطة لم تحدد matInput على العنصر <input>.
غير صحيح:
\n<mat-form-field>\n <input placeholder="البريد الإلكتروني">\n</mat-form-field>\nصحيح:
\n<mat-form-field>\n <input matInput placeholder="البريد الإلكتروني">\n</mat-form-field>\nتحقق أيضًا من أنك قمت باستيراد MatInputModule في الوحدة الخاصة بك:
import { MatInputModule } from '@angular/material/input';\n\n@NgModule({\n imports: [MatInputModule]\n})\nexport class AppModule { }\n\n2. استخدام عنصر HTML خاطئ
\nMatInput يعمل فقط مع <input> و <textarea>. إذا حاولت تغليف <div> عادي أو <select> (بدون mat-select) داخل mat-form-field، فستحصل على خطأ.
غير صحيح:
\n<mat-form-field>\n <div>بعض المحتوى</div>\n</mat-form-field>\nصحيح: استخدم مكونات Material المناسبة:
\n<mat-form-field>\n <mat-select placeholder="المدينة">\n <mat-option value="1">القاهرة</mat-option>\n </mat-select>\n</mat-form-field>\nبالنسبة لـ mat-select، تحتاج إلى استيراد MatSelectModule.
3. المكون المخصص لا ينفذ MatFormFieldControl
\nهذه حالة أكثر تعقيدًا. لنفترض أنك أنشأت مكونًا خاصًا بك لإدخال التاريخ أو التقييم. Angular Material لا يعرف عنه. تحتاج إلى "تعليمه" بشكل صريح.
\n