MatFormFieldControl: تحليل الخطأ مرة واحدة وإلى الأبد

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا يصرخ نموذج Angular الخاص بك بخطأ؟

\n

هل سبق لك أن واجهت موقفًا: تكتب نموذجًا جميلاً باستخدام Angular Material، ويبدو كل شيء مثاليًا، ولكن فجأة تظهر وحدة تحكم المتصفح رسالة:

\n
mat-form-field must contain a MatFormFieldControl
\n

أو، إذا كنت تستخدم الوضع الصارم لـ TypeScript، فقد يظهر شيء مثل:

\n
Error: 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\n

ما هو MatFormFieldControl ولماذا هو مطلوب؟

\n

قبل معالجة الخطأ، دعنا نفهم تشريح Angular Material. mat-form-field هو حاوية تضيف تنسيق Material Design (تسمية، تسطير، تلميحات، أخطاء). لكنه في حد ذاته لا يعرض أي شيء. يحتاج إلى "طفل" - توجيه أو مكون يقوم بتنفيذ الواجهة MatFormFieldControl.

\n

تصف هذه الواجهة (أو الفئة المجردة) كيفية تفاعل عنصر التحكم مع النموذج: كيفية الحصول على القيمة، وكيفية إظهار الخطأ، وكيفية معالجة التركيز. التنفيذ القياسي هو MatInput. إذا كتبت:

\n
<mat-form-field>\n  <input matInput placeholder="الاسم">\n</mat-form-field>
\n

— فإن التوجيه matInput يقوم تلقائيًا بتنفيذ MatFormFieldControl.

\n

يحدث الخطأ عندما لا يعثر Angular على أي عنصر فرعي بهذا التنفيذ. على سبيل المثال:

\n
<mat-form-field>\n  <input placeholder="الاسم"> <!-- لا يوجد matInput! -->\n</mat-form-field>
\n

أو عندما تحاول استخدام مكون مخصص لم يقم بتوصيل الواجهة.

\n\n

الأسباب النموذجية للخطأ (وكيفية إصلاحها)

\n\n

1. نسيت إضافة التوجيه matInput

\n

السبب الأكثر تافهًا. أنت ببساطة لم تحدد matInput على العنصر <input>.

\n

غير صحيح:

\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 في الوحدة الخاصة بك:

\n
import { MatInputModule } from '@angular/material/input';\n\n@NgModule({\n  imports: [MatInputModule]\n})\nexport class AppModule { }
\n\n

2. استخدام عنصر HTML خاطئ

\n

MatInput يعمل فقط مع <input> و <textarea>. إذا حاولت تغليف <div> عادي أو <select> (بدون mat-select) داخل mat-form-field، فستحصل على خطأ.

\n

غير صحيح:

\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.

\n\n

3. المكون المخصص لا ينفذ MatFormFieldControl

\n

هذه حالة أكثر تعقيدًا. لنفترض أنك أنشأت مكونًا خاصًا بك لإدخال التاريخ أو التقييم. Angular Material لا يعرف عنه. تحتاج إلى "تعليمه" بشكل صريح.

\n

المدونات

توصيات الكتب