في الدليل السابق، أوضحنا كيفية إعداد كلا الجزأين: جانب الخادم وجانب العميل في Discourse للرد على طلب.
ننصحك الآن بقراءة وثائق مكونات Ember: Introducing Components - Components - Ember Guides
قبل كتابة مكوّن، تحقق من مجموعة واجهة المستخدم التي تحتوي على مكونات وأدوات مساعدة ومعدّلات مشتركة؛ فمعظم عناصر التحكم الشائعة موجودة بالفعل هناك.
دليل قديم
في هذا الدليل، سنقوم بإنشاء مكوّن Ember جديد كطريقة لتغليف جافاسكريبت من أطراف ثالثة. سيكون هذا مشابهًا لفيديو على يوتيوب أنشأته منذ فترة، والذي قد تجده مفيدًا، لكن هذه المرة سيكون مخصصًا لـ Discourse وكيفية تنظيم الملفات في مشروعنا.
لماذا المكونات؟
Handlebars لغة بسيطة ومغرية إلى حد كبير. فهي تتكون من HTML عادي مع بعض الأجزاء الديناميكية. إنها سهلة التعلّم وممتازة للإنتاجية، لكنها ليست جيدة جدًا لإعادة استخدام الكود. إذا كنت تقوم بتطوير تطبيق كبير مثل Discourse، فستجد أنك تريد إعادة استخدام بعض الأشياء نفسها مرارًا وتكرارًا.
المكونات هي حل Ember لهذه المشكلة. لننشئ مكوّنًا سيُعرض وجبتنا الخفيفة بطريقة أنظف.
إنشاء مكوّن جديد
يجب أن تحتوي أسماء المكونات على شرطة (-). سأختار fancy-snack كاسم لهذا المكوّن. لننشئ قالبنا (Template):
app/assets/javascripts/admin/templates/components/fancy-snack.hbs
<div class="fancy-snack-title">
<h1>{{snack.name}}</h1>
</div>
<div class="fancy-snack-description">
<p>{{snack.description}}</p>
</div>
الآن، لاستخدام مكوّننا، سنقوم بإحلال هذا الموضع محل قالب admin/snack الحالي لدينا:
app/assets/javascripts/admin/templates/snack.hbs
{{fancy-snack snack=model}}
يمكننا الآن إعادة استخدام مكوّن fancy-snack في أي قالب آخر، بمجرد تمرير النموذج (model) كما هو مطلوب.
إضافة جافاسكريبت مخصص
بالإضافة إلى إمكانية إعادة الاستخدام، المكونات في Ember رائعة لإضافة جافاسكريبت مخصص، وjQuery، وأكواد خارجية أخرى بأمان. فهي تمنحك التحكم في وقت إدراج المكوّن في الصفحة، ووقت إزالته. للقيام بذلك، نعرّف Ember.Component مع بعض الكود:
app/assets/javascripts/admin/components/fancy-snack.js
export default Ember.Component.extend({
didInsertElement() {
this._super();
this.$().animate({ backgroundColor: "yellow" }, 2000);
},
willDestroyElement() {
this._super();
this.$().stop();
},
});
إذا أضفت الكود أعلاه وقمت بتحديث الصفحة، فستلاحظ أن وجبتنا الخفيفة تحتوي على حركة انيميشن لخلفية صفراء تتلاشى ببطء.
لنشرح ما يحدث هنا:
-
عندما يُعرض المكوّن على الصفحة، سيقوم باستدعاء
didInsertElement -
السطر الأول في
didInsertElement(وwillDestroyElement) هوthis._super()وهو ضروري لأننا نقوم بـ إرث (Subclassing) لـ Ember.Component. -
يتم تنفيذ الحركة باستخدام دالة animate في jQuery.
-
أخيرًا، يتم إلغاء الحركة في الخطاف (Hook)
willDestroyElement، والذي يُستدعى عندما يُزال المكوّن من الصفحة.
قد تتساءل لماذا نهتم بـ willDestroyElement على الإطلاق؛ السبب هو أنه في تطبيق جافاسكريبت طويل العمر مثل Discourse، من المهم تنظيف ما خلفناه، حتى لا نُسرب الذاكرة أو نترك أشياء تعمل في الخلفية. في هذه الحالة، نوقف الحركة، مما يخبر مؤقتات jQuery بأن لا حاجة لها للعمل بعد الآن لأن المكوّن لم يعد مرئيًا على الصفحة.
أين تذهب من هنا
يتناول الدليل النهائي في هذه السلسلة الاختبار الآلي (Automated Testing).
هذا المستند خاضع لرقمنة الإصدارات (Version Controlled) - اقترح تغييرات على github.