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