صحيح. هناك طريقتان للقيام بذلك…
-
يمكنك جعل التخصيص الخاص بك widget، ثم تحميل widget في plugin outlet هكذا:
{{mount-widget widget="widget-name"}}يمكنك رؤية مثال لكيفية إنشاء widget في Discourse، على سبيل المثال شعار الصفحة الرئيسية: discourse/app/assets/javascripts/discourse/app/widgets/home-logo.js at 2dbcea9eeeb816dda347027497b3a49634ef851f · discourse/discourse · GitHub
في سمة، ستضيف ملف
widget-name.jsالخاص بك إلى دليلjavascripts/discourse/widgetsهناك المزيد حول widgets في https://meta.discourse.org/t/a-tour-of-how-the-widget-virtual-dom-code-in-discourse-works/40347، ولكن لاحظ أننا سنتخلص تدريجياً من widgets، لذا فإن أي شيء تتعلمه في هذه العملية لن يكون مفيدًا على المدى الطويل.
-
احتفظ بـ 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); } } }- في
component-name.hbs:
<div {{did-insert this.fetchNavLinks}}> {{#each this.navLinks as |link|}} <a href={{link.anchor}}>{{link.title}}</a> {{/each}} </div>سيؤدي هذا إلى استدعاء الإجراء
fetchNavLinksكلما تم إدراج المكون (في هذه الحالة، عند زيارة موقع Discourse وعرض التطبيق). كلما تم تحديثnavLinks، سيتم تحديث محتوى المكون لأنه خاصية متعقبة.إذا كنت ترغب في تحديث الروابط بشكل متكرر أكثر من مجرد عرض المكون، فستحتاج إلى إضافة المزيد من المنطق إلى JS هنا… التحقق مما إذا كان المسار الحالي (الصفحة) يفي بشروط معينة على سبيل المثال.
- سيتم إضافة هذا المكون إلى plugin outlet عن طريق إضافته إلى الـ outlet في
javascripts/discourse/connectors/below-site-header/my-component-connector.hbs:
<ComponentName /> - أنشئ ملف JS و HBS (قالب) للمكون في دليل