أريد استخدام خدمة في مكون سمة أقوم ببنائه. إذا كانت الخدمات متاحة فقط في المكونات الإضافية، يمكنني بناء مكون إضافي أيضًا. الهدف هو ربط منفذين مختلفين للمكونات الإضافية - الضغط على زر في منفذ واحد، وجعل هذا الضغط على الزر يتم التقاطه بواسطة المنفذ الآخر.
كيف يمكنني تسجيل خدمة بشكل صحيح في Discourse؟ لقد اتبعت الموضوع هنا، وكود المكون الإضافي ذي الصلة على github، ولكنني غير قادر على جعله يعمل.
أعتقد أن الجزء المفقود هو أن مكون السمة الخاص بي لا يتعرف على الخدمة. (جربته في مكون إضافي أيضًا، مع نفس النتيجة).
إليك بعض الأكواد التي جربتها:
javascripts/discourse/services/great-stuff.js:
import Service, { inject as service } from "@ember/service";
export default class GreatStuffService extends Service {
call() {
console.log('you called it')
}
}
@david: شكراً جزيلاً لك على هذا الشرح والأمثلة البرمجية. بهذه الأمثلة، تمكنت من جعله يعمل للنقر على زر في مكون، وجعله يستدعي إجراءً في الخدمة. هذه خطوة كبيرة إلى الأمام.
الآن أحاول فرز النصف الآخر - بمجرد استدعاء إجراء في خدمة، اجعلها تشغل إجراءً في مكون. أعتقد أنها تشبه استيراد المكون في الخدمة واستدعاء دالة في هذا المكون (و/أو الاشتراك في الإجراء في المكون). لكنني لم أحصل على الصيغة بعد.
استدعاء طريقة مكون من خدمة ليس من أفضل الممارسات حقًا، ولا توفر Ember طريقة سهلة للقيام بذلك. يمكن أن تكون هناك مثيلات متعددة للمكون، فكيف ستعرف الخدمة أي منها يجب تشغيل الإجراء عليه؟
ومع ذلك، قد يكون من الضروري أحيانًا إنجاز شيء ما ضمن قيود نظام منافذ الإضافات في Discourse.
أوصي بنفس ما أوصى به @fzngagan - ألقِ نظرة على appEvents. إنها ربما الطريقة الأنظف لتشغيل منطق المكون من خدمة.
مثير للاهتمام! شكرًا على المتابعة. لستُ معتادًا على evented - لم أستخدمه من قبل وكنت أواجه بعض الصعوبة في بناء الجملة في خدمة Discourse: export default class GreatStuffService extends Service.extends(Evented, {...})
ليس صحيحًا تمامًا.
لم أستخدم appEvents من قبل أيضًا. هل يمكنني إنشاء appEvent جديد في مكون إضافي/سمة يمكنني الاشتراك فيه بعد ذلك؟ معظم الأمثلة التي أجدها تتعلق بالاشتراك في appEvents المعدة بالفعل في نواة Discourse.