أنا جديد على تصميم Discourse و emberjs، وأعمل حاليًا على سمة تحتوي على عناصر تنقل من الموقع الرئيسي.
يأتي ملف JSON لعناصر التنقل من طلب ajax وأحتاج إلى عرضه في مكانين.
المكان الأول هو header-buttons:before. تمكنت من القيام بذلك باستخدام api.decorateWidget وتشغيل site-header:force-refresh لـ appEvents.
المكان الثاني هو عبر pluginOutlet، below-site-header.
أعتقد أنه لا يمكنني فعل الشيء نفسه كما في الأعلى، باستخدام api.decorateWidget، لأن هذا pluginOutlet وليس widget (؟).
أسئلتي هي:
كيف يمكنني إدراج محتوى ajax يدويًا في pluginOutlet؟
أود أيضًا أن أعرف كيف يمكنني تجميع virtual-dom في الوقت المناسب بعد استدعاء ajax الخاص بي؟ على سبيل المثال، المتغير أعلاه، headerNav، أود الحصول على علامة HTML مجمعة له. لست متأكدًا من المكتبة / الدالة التي يجب استخدامها.
إذا كان ذلك ممكنًا، كيف يمكنني أيضًا إعادة عرض pluginOutlet؟ مشابه لـ appEvents.trigger("site-header:force-refresh");
احتفظ بـ widget decorator الخاص بك كما هو، وأنشئ مكون Ember منفصلاً يقوم بما تريده في plugin outlet. لقد كنا نتخلص تدريجياً من widgets لصالح مكونات Ember (وهو ما بُني عليه معظم Discourse).
ستبدو هذه العملية كالتالي:
أنشئ ملف JS و HBS (قالب) للمكون في دليل javascripts/discourse/components الخاص بالسمة.
component-name.js
component-name.hbs
قم ببناء مكون Ember الخاص بك… للأسف، هذه الخطوة هي في الأساس “تعلم Ember” (أدلة Ember) … ولكن أعتقد أن هذا قد يعطيك فكرة تقريبية للبدء:
في component-name.js:
import Component from "@glimmer/component";
import { tracked } from "@glimmer/tracking";
import { action } from "@ember/object";
const endpoint = settings.site_navigation_links_endpoint;
export default class ComponentName extends Component {
@tracked navLinks = null;
@action
async fetchNavLinks() {
try {
const response = await fetch(endpoint);
const data = await response.json(); // نفترض أن هذا هو json
this.navLinks = data;
} catch (error) {
console.error("فشل:", error);
}
}
}
سيؤدي هذا إلى استدعاء الإجراء fetchNavLinks كلما تم إدراج المكون (في هذه الحالة، عند زيارة موقع Discourse وعرض التطبيق). كلما تم تحديث navLinks، سيتم تحديث محتوى المكون لأنه خاصية متعقبة.
إذا كنت ترغب في تحديث الروابط بشكل متكرر أكثر من مجرد عرض المكون، فستحتاج إلى إضافة المزيد من المنطق إلى JS هنا… التحقق مما إذا كان المسار الحالي (الصفحة) يفي بشروط معينة على سبيل المثال.
سيتم إضافة هذا المكون إلى plugin outlet عن طريق إضافته إلى الـ outlet في javascripts/discourse/connectors/below-site-header/my-component-connector.hbs:
لقد اخترت النهج الثاني، باستخدام المكون (component)، حيث يتم التخلص تدريجياً من الأدوات (widgets). بصرف النظر عن الخطأ المطبعي الصغير في استدعاء الدالة، في ملف .hbs يجب أن يكون {{did-insert this. fetchNavLinks}}، كل شيء يعمل!
من الرائع معرفة أن لدينا did-insert، هذا يبعث على الارتياح! لقد انتهيت الآن من المهمة.