كيف يمكنني تحديث قائمة المواضيع بعد إجراء تغيير؟

لقد قمت بتطبيق زر مخصص في قائمة إجراءات المنشور يقوم بـ “إخراج” المنشور من سلسلة الموضوع الحالية. إنه إجراء متاح لمؤلف الموضوع والذي يؤدي بشكل أساسي إلى عملية النقل، ولكن بنقرات أقل. يتم تنفيذ العملية الخلفية بواسطة نقطة نهاية API مخصصة جديدة. يعمل الزر الخاص بي، باستثناء أنني بحاجة إلى تحديث الصفحة يدويًا لرؤية أنه تم نقل المنشور.

بعد التحديث، يبدو المنشور كالتالي:

سؤالي هو، ما هي أفضل طريقة لتحديث DOM بهذا التغيير؟ من الناحية المثالية، سأقوم فقط باستبدال المنشور بالرمز المؤقت للانقسام الموضح أعلاه، وتجنب تحديث الصفحة بأكملها، أو قائمة المواضيع بأكملها.

يمكنني أن أتخيل، إذا قامت نقطة نهاية API الخاصة بي بإرجاع الموضوع المتغير، فأنا بحاجة فقط إلى استبدال/حقن المنشور الجديد في قائمة المواضيع؟

لذا، أعتقد أن هذا سؤال حول كيفية عمل إدارة الحالة داخل Discourse، وكيف يمكنني الارتباط بتلك الدورة الحياتية.

إعجابَين (2)

ابحث في المستودع الأساسي (أو مستودع all-the-plugins) عن الأشياء التي تقوم بتحديث MessageBus

إعجاب واحد (1)

حل

وضع هذا في نهاية طريقة API الخاصة بي حل المشكلة:

MessageBus.publish("/topic/#{@topic.id}", reload_topic: true, refresh_stream: true)

هذا يجب أن يقوم بالتحديث ليس فقط للمستخدم الحالي، ولكن لأي شخص آخر يشاهد الموضوع.

استكشاف أدى بي إلى هنا

تابع القراءة إذا كنت ترغب في تتبع معي عبر قاعدة الأكواد. أشارك هذا لأي شخص قد يكون مفيدًا له.

ما هو MessageBus؟

من شرح سام لـ MessageBus عام 2013 يبدو أن كود Ruby يمكنه النشر والاشتراك، بينما كود Javascript يمكنه فقط الاشتراك. حسنًا، تحت هذه البنية المقترحة، سيكون كود جانب الخادم الخاص بي مسؤولاً عن إخطار واجهة المستخدم.

هل هناك مثال لـ MessageBus مفيد لي؟

لا تقوم أي من أمثلة الإضافات بأي شيء مع MessageBus.

GroupArchivedMessage.move_to_inbox! يستدعي هذا الكود وهو قريب إلى حد ما مما أريده، ولكن نوع الكود المستخدم هنا لن يعمل بالنسبة لي.

MessageBus.publish("/topic/#{topic_id}", { type: "move_to_inbox" }, group_ids: [group_id])

يبدو هذا الكود واعدًا.

MessageBus.publish("/topic/#{@topic.id}", reload_topic: true, refresh_stream: true)

كان هذا هو الحل النهائي الذي اخترته.

ماذا يحدث عندما يتلقى المتصفح التحديث؟

وحدة تحكم المواضيع (Topics controller) مشترك في التحديثات على الموضوع الذي يعرضه حاليًا. يقوم بتشغيل "post-stream:refresh"، مما يبدأ التحديث. الشيء الوحيد الذي يمكنني العثور عليه يستمع على الطرف الآخر هو ScrollingPostStream الذي يربط طريقة _refresh بالحدث. يبدو أن هذا هو ما يقوم فعليًا بالتحديث.

بناءً على هذا، أستنتج أنه إذا كنت أرغب في تحديث العميل الحالي فقط دون دفع التحديث إلى أي شخص آخر، يمكنني استدعاء نفس الكود بنفسي:

this.appEvents.trigger("post-stream:refresh", args)

ويبدو أنه يمكنني استدعاء هذا من أي مكون.

ماذا عن التنفيذ الأصلي لـ move_posts؟ هل ينشر إلى MessageBus؟

بالتحقيق في النواة أرى: طريقة وحدة تحكم الموضوع move_posts() تستدعي move_posts_to_destination() التي تستدعي topic.move_posts() التي تستدعي new PostMover() ثم إما to_topic() أو to_new_topic(). هذه الطرق لا تستدعي MessageBus، لكنها تستدعي DiscourseEvent.trigger().

أنا أستدعي topic.move_posts() من طريقة API المخصصة الخاصة بي. لذا فإن الكود الخاص بي يستدعي مباشرة النموذج، ويتجاوز أي منطق وحدة تحكم موجود:

new_topic = topic.move_posts(current_user, [post.id], {title: title, category_id: category_id})

في حالتي، يتم استدعاء move_posts_to() كخطوة أخيرة في التسلسل، والتي تستدعي ما يلي:

DiscourseEvent.trigger(
  :posts_moved,
  destination_topic_id: destination_topic.id,
  original_topic_id: original_topic.id,
)

DiscourseEvent لا يبدو أن له علاقة بـ MessageBus، ومع ذلك. ربما يستخدم فقط لدورات الحياة الداخلية داخل الخادم؟

لذا أستنتج أن MessageBus لا يتم نشره عادةً لنقل موضوع.

4 إعجابات

أوه. آسف. هذا مفاجئ بعض الشيء! أعتقد أنه كان يجب أن أرسلك إلى النواة! لدي مكون إضافي يستخدمه، ولكنه ليس عامًا ويستخدم MessageBus لنموذج مخصص.

لست متأكدًا، ولكن أعتقد أنك ربما لا تحتاج إلى إعادة تحميل الموضوع (إلا إذا تغيرت الأشياء التي لا تظهر بدون السمات المتغيرة؟)، ولكن لدي بعض الأماكن في المكون الإضافي الخاص بي حيث أعتقد أن ذلك قد يحل مشكلة!

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.