خطأ formGroup في Angular: كيفية إصلاحه في 5 دقائق

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

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

ابدأ الدورة

«Can't bind to 'formGroup' since it isn't a known property of 'form'» — ألم مألوف؟

\n\n

إذا سبق لك أن حاولت إنشاء نموذج في Angular ورأيت في وحدة تحكم المتصفح رسالة حمراء Can't bind to 'formGroup' since it isn't a known property of 'form' — فأنت لست وحدك. هذا الخطأ يدخل ضمن أكثر 5 أسئلة شيوعاً على Stack Overflow بخصوص Angular. آلاف المطورين (وأنا منهم) أضاعوا ساعات في محاولة فهم ما الخطأ.

\n\n

الخبر الجيد: السبب دائمًا تقريبًا واحد، ويتم إصلاحه في دقيقتين. الخبر السيئ: إذا كنت لا تعرف أين تبحث، فقد تعيد كتابة النموذج بالكامل ولا تجد جذر المشكلة.

\n\n

في هذه المقالة سنشرح:

\n
    \n
  • لماذا يظهر الخطأ formGroup unknown property
  • \n
  • كيفية استيراد ReactiveFormsModule بشكل صحيح
  • \n
  • ثلاث طرق لإصلاح الخطأ مع أمثلة كود بلغة TypeScript
  • \n
  • كيفية تجنب المشكلة في المستقبل
  • \n
\n\n

هيا بنا! 🚀

\n\n

ماذا يعني خطأ «Can't bind to 'formGroup'»؟

\n\n

Angular هو إطار عمل ذو كتابة صارمة. عندما تكتب في القالب:

\n\n
<form [formGroup]="myForm">
\n\n

يبحث Angular عن توجيه (directive) يمكنه معالجة السمة formGroup. إذا لم يتم العثور على هذا التوجيه، يظهر الإطار خطأ: «Can't bind to 'formGroup' since it isn't a known property of 'form'».

\n\n

هذا يشبه الموقف عندما تحاول إدخال USB في المنفذ ولكن بالجهة الخاطئة. يبدو أن كل شيء مناسب، لكن نقاط الاتصال غير متطابقة. Angular ببساطة لا يعرف ماذا يفعل بـ formGroup لأن الوحدة المطلوبة غير متصلة.

\n\n

السبب الرئيسي: عدم وجود ReactiveFormsModule

\n\n

التوجيه formGroup موجود في الوحدة ReactiveFormsModule. إذا لم تقم باستيرادها في AppModule الخاص بك (أو في الوحدة التي تستخدم المكون)، فلن يتمكن Angular من التعرف على السمة.

\n\n

إليك كيف يبدو السيناريو النموذجي للخطأ:

\n\n
    \n
  1. تقوم بإنشاء مكون مع نموذج
  2. \n
  3. في TypeScript تعرّف FormGroup
  4. \n
  5. في القالب تستخدم [formGroup]="myForm"
  6. \n
  7. تحصل على الخطأ في وحدة التحكم
  8. \n
\n\n

كيفية الإصلاح: مثال كامل للكود بلغة TypeScript

\n\n

دعنا ننشئ نموذجًا عمليًا خطوة بخطوة ونشرح كل خطوة.

\n\n

الخطوة 1. إنشاء مكون مع نموذج

\n\n

أولاً، نحدد النموذج في ملف TypeScript الخاص بالمكون:

\n\n
// my-form.component.ts\nimport { Component, OnInit } from '@angular/core';\nimport { FormGroup, FormControl, Validators } from '@angular/forms';\n\n@Component({\n  selector: 'app-my-form',\n  templateUrl: './my-form.component.html',\n  styleUrls: ['./my-form.component.css']\n})\nexport class MyFormComponent implements OnInit {\n  myForm!: FormGroup;\n\n  ngOnInit(): void {\n    this.myForm = new FormGroup({\n      name: new FormControl('', Validators.required),\n      email: new FormControl('', [Validators.required, Validators.email])\n    });\n  }\n\n  onSubmit(): void {\n    if (this.myForm.valid) {\n      console.log('تم إرسال النموذج:', this.myForm.value);\n    }\n  }\n}
\n\n

الخطوة 2. القالب الصحيح (HTML)

\n\n

في القالب نستخدم التوجيه formGroup:

\n\n
<!-- my-form.component.html -->\n<form [formGroup]="myForm" (ngSubmit)="onSubmit()">\n  <div>\n    <label for="name">الاسم:</label>\n    <input id="name" type="text" formControlName="name">\n  </div>\n\n  <div>\n    <label for="email">البريد الإلكتروني:</label>\n    <input id="email" type="email" formControlName="email">\n  </div>\n\n  <button type="submit" [disabled]="!myForm.valid">إرسال</button>\n</form>

المدونات

توصيات الكتب