في البرنامج التعليمي السابق أوضحت كيفية تكوين كل من جانب الخادم وجانب العميل في Discourse للاستجابة لطلب ما.
نوصيك الآن بقراءة وثائق مكون Ember: Introducing Components - Components - Ember Guides
البرنامج التعليمي القديم
في هذا البرنامج التعليمي، سأقوم بإنشاء مكون Ember جديد كوسيلة لتغليف جافاسكريبت (Javascript) تابعة لجهة خارجية. سيكون هذا مشابهًا لفيديو يوتيوب قمت بإنشائه منذ فترة، والذي قد تجده مفيدًا، ولكن هذه المرة هو خاص بـ Discourse وكيفية ترتيب الملفات في مشروعنا.
لماذا المكونات؟
Handlebars هي لغة قوالب بسيطة جدًا. إنها مجرد HTML عادي إلى جانب بعض الأجزاء الديناميكية. هذا سهل التعلم ورائع للإنتاجية، ولكنه ليس رائعًا لإعادة استخدام التعليمات البرمجية. إذا كنت تقوم بتطوير تطبيق كبير مثل Discourse، فستجد أنك تريد إعادة استخدام بعض الأشياء نفسها مرارًا وتكرارًا.
المكونات هي حل Ember لهذه المشكلة. لنقم بإنشاء مكون سيعرض الوجبة الخفيفة (snack) بطريقة أجمل.
إنشاء مكون جديد
يجب أن تحتوي المكونات على شرطة في أسمائها. سأختار fancy-snack كاسم لهذا المكون. لنقم بإنشاء القالب الخاص بنا:
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();
},
});
إذا أضفت الكود أعلاه وقمت بتحديث الصفحة، فسترى أن الوجبة الخفيفة لدينا بها حركة (animation) لخلفية صفراء تتلاشى ببطء.
دعنا نشرح ما يحدث هنا:
-
عندما يتم عرض المكون على الصفحة، سيتم استدعاء
didInsertElement -
السطر الأول من
didInsertElement(وwillDestroyElement) هوthis._super()وهو ضروري لأننا نورث من Ember.Component. -
يتم إجراء الحركة باستخدام دالة jQuery’s animate.
-
أخيرًا، يتم إلغاء الحركة في خطاف
willDestroyElement، والذي يتم استدعاؤه عند إزالة المكون من الصفحة.
قد تتساءل لماذا نهتم بـ willDestroyElement على الإطلاق؛ السبب هو أنه في تطبيق جافاسكريبت طويل الأمد مثل Discourse، من المهم تنظيف ما بعدنا، حتى لا نتسرب الذاكرة أو نترك الأشياء قيد التشغيل. في هذه الحالة، نوقف الحركة، مما يخبر أي مؤقتات jQuery بأنه ليس من الضروري أن تظهر بعد الآن لأن المكون لم يعد مرئيًا على الصفحة.
الخطوات التالية
البرنامج التعليمي النهائي في هذه السلسلة يغطي الاختبار الآلي.
يتم التحكم في إصدار هذه الوثيقة - اقترح تغييرات على github.