نوفيل
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
دخولابدأ مجاناً
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
نوفيل

منصة تعليم البرمجة الأولى بالعربي. تعلم من الصفر حتى الاحتراف مع كورسات احترافية وتحديات ذكاء اصطناعي.

المنصة

  • الكورسات
  • التحديات
  • المقالات
  • الأدوات

الحساب

  • إنشاء حساب
  • تسجيل الدخول
  • لوحة التحكم
  • الملف الشخصي

روابط

  • سياسة الخصوصية
  • شروط الاستخدام
  • عن نوفيل
  • تواصل معنا

© 2026 نوفيل. جميع الحقوق محفوظة.

صُنع بـ في مصر

نوفيل
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
دخولابدأ مجاناً
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
AN

منهج Angular

دليل مرجعي شامل

كل اللغات
مدرسة البرمجة/منهج Angular /تمرير المراجع والبيانات باستخدام خاصية Model في الإشارات

تمرير المراجع والبيانات باستخدام خاصية Model في الإشارات

دالة modelالإشاراتSignalsالربط ثنائي الاتجاهTwo-Way Bindingتمرير المراجع

جدول مرجعي سريع

1
معيار المقارنة البرمجيةالربط ثنائي الاتجاه التقليدي (@Input و @Output)الربط الحديث المعتمد على الإشارات (model API)
طريقة التعريف في صنف المكون@Input() count: number; و @Output() countChange = new EventEmitter<number>();count = model<number>(0);
تحديث القيمة وإرسالها للأبthis.count = 5; this.countChange.emit(5);this.count.set(5); (تقوم بتحديث القيمة وإرسالها تلقائياً)
طبيعة المتغير داخل المكونمتغير عادي يحتاج لإدارة يدوية للتحديثاتإشارة قابلة للكتابة (WritableSignal) تتكامل مع تأثيرات الإشارات الأخرى
حجم الكود وسهولة الصيانةيتطلب كتابة مزدوجة وإدارة دقيقة لأسماء المخرجاتكود مختصر، آمن كلياً من حيث الأنواع (Type-safe)، وتحديث تلقائي

الشرح

نصل في هذا الدرس الثامن من الفصل السادس إلى جوهرة التاج في الربط المتقدم للبيانات في إصدار Angular 22.1، ألا وهي تمرير المراجع والبيانات باستخدام model في الإشارات. تعتبر دالة model() البديل الحديث والذكي لنمط الربط ثنائي الاتجاه (Two-Way Data Binding) القديم الذي كان يتطلب استخدام @Input مع @Output بشكل مزدوج. باستخدام الـ model، تحصل على إشارة قابلة للكتابة (WritableSignal) تعمل كمدخل للبيانات ومخرج للتحديثات في نفس الوقت وبسطر كود واحد، مما يقلل الحجم البرمجي ويزيد من نظافة الكود وتماسكه.

تفصيل فلسفة وعمل دالة model في الإشارات

الآلية السحرية المخفية (Implicit Output):

عندما تقوم بتعريف خاصية باستخدام model()، مثل count = model(0)، يقوم محرك أنجولر تلقائياً بإنشاء مخرج (Output) مخفي يحمل نفس اسم المتغير مضافاً إليه كلمة Change (أي countChange). هذا يسمح للمكون الأب باستخدام صيغة الربط ثنائي الاتجاه الشهيرة [(count)] بكل سلاسة وبدون أي إعدادات إضافية.

إشارة قابلة للكتابة (WritableSignal):

على عكس دالة input() التي ترجع إشارة للقراءة فقط (Read-only Signal)، فإن دالة model() ترجع إشارة قابلة للكتابة. هذا يعني أنه يمكنك استخدام الدوال .set() أو .update() لتعديل قيمتها من داخل المكون الفرعي، وبمجرد تعديلها، يتم إرسال القيمة الجديدة للمكون الأب تلقائياً، وتحديث كافة الواجهات المعتمدة عليها.

أمثلة برمجية: بناء مكون فرعي متقدم باستخدام model

المثال الأول: صنف الـ TypeScript للمكون الفرعي (عداد أرقام ذكي)

typescript
1import { Component, model } from '@angular/core';
2
3@Component({
4 selector: 'app-number-stepper',
5 standalone: true,
6 templateUrl: './number-stepper.component.html',
7 styleUrl: './number-stepper.component.css'
8})
9export class NumberStepperComponent {
10 // استخدام model لإنشاء ربط ثنائي الاتجاه مع المكون الأب
11 // تعمل كإشارة يمكن قراءتها وتعديلها وإرسال تحديثاتها تلقائياً
12 stepValue = model<number>(0);
13
14 increment() {
15 // تحديث القيمة داخلياً، وسيتم إخطار المكون الأب فوراً
16 this.stepValue.update(current => current + 1);
17 }
18
19 decrement() {
20 this.stepValue.update(current => current - 1);
21 }
22}

أمثلة برمجية: قالب العرض HTML الخاص بالمكون الفرعي

المثال الثاني: قالب HTML للمكون الفرعي للعداد

html
1<div class="stepper-container">
2 <button class="btn-step" (click)="decrement()">-</button>
3
4 <!-- قراءة قيمة الـ model كدالة إشارة -->
5 <span class="step-display">{{ stepValue() }}</span>
6
7 <button class="btn-step" (click)="increment()">+</button>
8</div>

أمثلة برمجية: ملف التنسيق CSS الخاص بالمكون الفرعي

css
1.stepper-container {
2 display: inline-flex;
3 align-items: center;
4 background-color: #f1f5f9;
5 border-radius: 8px;
6 padding: 4px;
7 border: 1px solid #cbd5e1;
8}
9
10.btn-step {
11 background-color: #3b82f6;
12 color: white;
13 border: none;
14 border-radius: 4px;
15 width: 36px;
16 height: 36px;
17 font-size: 1.2rem;
18 font-weight: bold;
19 cursor: pointer;
20 display: flex;
21 justify-content: center;
22 align-items: center;
23 transition: background-color 0.2s;
24}
25
26.btn-step:hover {
27 background-color: #2563eb;
28}
29
30.step-display {
31 min-width: 50px;
32 text-align: center;
33 font-size: 1.2rem;
34 font-weight: bold;
35 color: #1e293b;
36 margin: 0 12px;
37}

أمثلة برمجية: ربط المكون الأب بالمكون الفرعي عبر الربط المزدوج

المثال الرابع: المكون الرئيسي الأب الذي يمرر البيانات ويستقبل التحديثات

typescript
1import { Component, signal } from '@angular/core';
2import { NumberStepperComponent } from './number-stepper.component';
3
4@Component({
5 selector: 'app-cart-manager',
6 standalone: true,
7 imports: [NumberStepperComponent],
8 template: `
9 <div class="parent-dashboard">
10 <h3>إدارة عربة التسوق (المكون الأب)</h3>
11 <p>الكمية المطلوبة حالياً: <strong>{{ productQuantity() }}</strong></p>
12
13 <!-- استخدام صيغة [(property)] المألوفة مع الـ model الحديث -->
14 <app-number-stepper [(stepValue)]="productQuantity"></app-number-stepper>
15
16 <div class="actions">
17 <button (click)="resetQuantity()">إعادة ضبط الكمية من الأب</button>
18 </div>
19 </div>
20 `
21})
22export class CartManagerComponent {
23 // إشارة في المكون الأب للتحكم في الكمية
24 productQuantity = signal<number>(5);
25
26 resetQuantity() {
27 // تحديث الإشارة في الأب سينعكس فوراً على المكون الفرعي
28 this.productQuantity.set(1);
29 }
30}

نصائح احترافية

  • —استخدم model فقط عندما تحتاج فعلياً إلى ربط ثنائي الاتجاه (Two-Way Binding)!
  • —إذا كان المكون الفرعي يحتاج فقط إلى عرض البيانات دون تعديلها، فاستخدم input(). وإذا كان يحتاج فقط إلى إرسال أحداث دون استقبال حالة ابتدائية، فاستخدم output(). احتفظ بالـ model() للمكونات التي تمثل مدخلات مستخدم (Forms, Steppers, Toggles) حيث يجب مزامنة البيانات وتمرير المراجع في كلا الاتجاهين باستمرار وبكفاءة عالية.

الدرس السابق

استبدال Output بالإشارات الحديثة

الدرس التالي

نظرة عامة على طرق التواصل

نوفيل

منصة تعليم البرمجة الأولى بالعربي. تعلم من الصفر حتى الاحتراف مع كورسات احترافية وتحديات ذكاء اصطناعي.

المنصة

  • الكورسات
  • التحديات
  • المقالات
  • الأدوات

الحساب

  • إنشاء حساب
  • تسجيل الدخول
  • لوحة التحكم
  • الملف الشخصي

روابط

  • سياسة الخصوصية
  • شروط الاستخدام
  • عن نوفيل
  • تواصل معنا

© 2026 نوفيل. جميع الحقوق محفوظة.

صُنع بـ في مصر