التواصل عبر الوحدات المدارية (Cross-Orbital)
الوحدات المدارية مستقلة بذاتها، لكن التطبيقات الحقيقية تحتاج أن تتحدث الميزات مع بعضها. Orb يربط الوحدات المدارية من خلال ناقل أحداث مُنمَّط: وحدة مدارية تُرسل، وأخرى تستمع.
Orbital Unit = Entity + Traits + Pages
النمط
CartManager orbital NotificationManager orbital
| |
CartActions trait NotificationHandler trait
| |
emits: ITEM_ADDED ──────────► listens: ITEM_ADDED
emits: CART_CLEARED ─────────► listens: CART_CLEARED
الخصائص الأساسية:
emits- تُعلَن على السمة وعلى الوحدة المدارية (ما هي الأحداث التي تنشرها)listens- تُعلَن على السمة (أي أحداث تتفاعل معها) وعلى الوحدة المدارية (أي وحدات مدارية تشترك فيها)scope: "external"- تحدد الحدث كعابر لحدود الوحدات المدارية
الخطوة 1 - إعلان Emits على السمة المُرسلة
السمة تُعلن الأحداث التي يمكنها نشرها، بما في ذلك عقد الحمولة:
{
"اسم": "CartActions",
"كيان_مرتبط": "Cart",
"فئة": "interaction",
"يصدر": [
{
"حدث": "ITEM_ADDED",
"نطاق": "external",
"وصف": "Emitted when an item is added to cart",
"حمولة": [
{
"اسم": "itemCount",
"نوع": "رقم",
"مطلوب": true
},
{
"اسم": "total",
"نوع": "رقم",
"مطلوب": true
}
]
}
],
"آلة_حالة": {
"...": "..."
}
}
scope: "external" مطلوب للأحداث العابرة للوحدات المدارية. بدونه، يبقى الحدث داخلياً للسمة.
الخطوة 2 - إطلاق الحدث في الانتقال
داخل effects للانتقال، استخدم ["emit", "EVENT_NAME", payload]:
{
"من": "empty",
"حدث": "ADD_ITEM",
"إلى": "hasItems",
"تأثيرات": [
[
"increment",
"@كيان.itemCount",
1
],
[
"تعيين",
"@كيان.total",
[
"جمع",
"@كيان.total",
"@حمولة.price"
]
],
[
"بث",
"ITEM_ADDED",
{
"itemCount": "@كيان.itemCount",
"total": "@كيان.total"
}
]
]
}
الخطوة 3 - إعلان Emits على مستوى الوحدة المدارية
على مستوى الوحدة المدارية، اذكر كل حدث تنشره:
{
"اسم": "CartManager",
"كيان": {
"...": "..."
},
"سمات": [
{
"...": "..."
}
],
"صفحات": [
{
"...": "..."
}
],
"يصدر": [
"ITEM_ADDED",
"CART_CLEARED"
]
}
الخطوة 4 - إعلان Listens على السمة المستقبلة
السمة المستقبلة تُعلن الأحداث الخارجية التي تعالجها:
{
"اسم": "NotificationHandler",
"كيان_مرتبط": "Notification",
"فئة": "interaction",
"يستمع": [
{
"حدث": "ITEM_ADDED",
"نطاق": "external"
},
{
"حدث": "CART_CLEARED",
"نطاق": "external"
}
],
"آلة_حالة": {
"...": "..."
}
}
هذه الأحداث تصبح مفاتيح أحداث صالحة في آلة الحالة. أضفها إلى events واكتب انتقالات لها.
الخطوة 5 - إعلان Listens على مستوى الوحدة المدارية
على مستوى الوحدة المدارية المستقبلة، أعلن من أين تأتي الأحداث:
{
"اسم": "NotificationManager",
"كيان": {
"...": "..."
},
"سمات": [
{
"...": "..."
}
],
"صفحات": [
{
"...": "..."
}
],
"يستمع": [
{
"حدث": "ITEM_ADDED",
"من": "CartManager"
},
{
"حدث": "CART_CLEARED",
"من": "CartManager"
}
]
}
قائمة التحقق: الأحداث عبر الوحدات المدارية
استخدم هذه القائمة عند ربط وحدتين مداريتين:
- السمة المُرسلة لديها
"emits": [...]معscope: "external"وعقدpayload - انتقال الإرسال يستدعي
["emit", "EVENT_NAME", {...payload}]فيeffects - الوحدة المدارية المُرسلة لديها
"emits": ["EVENT_NAME"]على المستوى الأعلى - السمة المستمعة لديها
"listens": [{ "event": "EVENT_NAME", "scope": "external" }] - آلة حالة السمة المستمعة لديها الحدث في
eventsوtransitionله - الوحدة المدارية المستمعة لديها
"listens": [{ "event": "EVENT_NAME", "from": "EmittingOrbital" }]على المستوى الأعلى
الخطوات التالية
- بناء تطبيق كامل - الأحداث عبر الوحدات المدارية في تطبيق من 3 وحدات
- الحراس وقواعد العمل - حماية انتقال بناءً على بيانات من وحدة مدارية أخرى