@Input و @Output هما الطريقة القياسية للتواصل بين مكون الوالد ومكون الطفل: @Input ينقل البيانات (الوالد → الطفل)، و يرسل الأحداث (الطفل → الوالد). وهذا يعكس النمط العالمي "props down, events up".
@Input و @Output هما الطريقة القياسية للتواصل بين مكون الوالد ومكون الطفل: @Input ينقل البيانات (الوالد → الطفل)، و يرسل الأحداث (الطفل → الوالد). وهذا يعكس النمط العالمي "props down, events up".
@Output// child: UserCardComponent
import { Component, Input } from "@angular/core";
@Component({ selector: "app-user-card", template: `<h2>{{ user.name }}</h2>` })
export class UserCardComponent {
@Input() user!: User; // receives data from the parent
@Input() showEmail = false; // with a default
}
<!-- parent passes data via property binding -->
<app-user-card [user]="currentUser" [showEmail]="true"></app-user-card>
// child emits an event the parent can listen to
import { Component, Output, EventEmitter } from "@angular/core";
@Component({
selector: "app-user-card",
template: `<button (click)="onDelete()">Delete</button>`,
})
export class UserCardComponent {
@Output() deleted = new EventEmitter<number>(); // declares an output event
onDelete() {
this.deleted.emit(this.user.id); // emit with a payload
}
}
<!-- parent listens via event binding -->
<app-user-card [user]="u" (deleted)="removeUser($event)"></app-user-card>
يرسل الطفل من خلال EventEmitter؛ يربط الوالد به باستخدام (eventName) ويستقبل الحمل كـ $event. الطفل لا يعدّل بيانات الوالد مباشرة — بل يطلب إجراءً بإرسال حدث.
Parent ──[user]──────────────→ Child (@Input: data down)
Parent ←──(deleted)=removeUser─ Child (@Output: events up)
name = input<string>(); // signal-based @Input (newer Angular)
deleted = output<number>(); // signal-based @Output
أضافت Angular الحديثة دوال input()/output() المستندة إلى signals كبديل.
@Input/@Output هما جوهر التواصل بين الوالد والطفل والمكونات القابلة لإعادة الاستخدام في Angular — فهما يفرضان تدفق البيانات في اتجاه واحد (لأسفل عبر inputs، لأعلى عبر events) الذي يحافظ على البيانات يمكن التنبؤ بها والمكونات غير المرتبطة.
فهم هذا الزوج ضروري لتكوين أي واجهة مستخدم في Angular غير تافهة؛ للتواصل بين المكونات غير ذات الصلة، ستستخدم بدلاً من ذلك خدمة مشتركة أو مكتبة state.