الطريقة الصحيحة لعرض النص بشكل شرطي في قالب - أو تعديل القيمة مرتين في عرض واحد

لديني ملحق يقوم (تقريبًا) بإنشاء Droplets في Digital Ocean وتثبيت Discourse.

لدي صفحة تحتوي على قالب يعرض معلومات حول نموذج Rails، وDroplet الذي ينشئه، ومثيلة Discourse التي يتم تثبيتها على الـ Droplet. لدي جميع المعلومات التي تحتاج إلى التدفق بين Rails و Ember عبر MessageBus. أريد عرض محتوى مختلف اعتمادًا على ما إذا كان:

  • تتوفر معلومات كافية لإنشاء الـ Droplet
  • المهمة المسؤولة عن إنشاء الـ Droplet قيد التنفيذ (حيث تقوم بتحديث البيانات في النموذج)
  • تم تثبيت Discourse بنجاح

أستمر في الحصول على الخطأ التالي:

   You modified "hasStatus" twice on <@ember/component:ember660> in a single render.

تعديل: حسنًا، كان السبب هو وجود دالتي computed تراقبان نفس الشيء…

أعتقد أنني أدركت أخيرًا أنني لا يمكنني استخدام شيء مثل {{#if hasStatus}} (وهي دالة محسوبة) في القالب، لأن الصفحة ستحتاج إلى إعادة تصيير لعرض الحالة بعد النقر على زر “إنشاء Droplet” (حيث سيؤدي ذلك إلى تعيين متغير installation_status الذي يعرض ما يحدث أثناء التثبيت).

أو ربما هناك خطأ آخر يسبب هذه المشكلة، وما أفعله يجب أن يعمل؟

لذا، أعتقد أن الحل هو استخدام CSS (يا لها من فكرة!) لإخفاء العناصر المختلفة؟

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

حسناً، وكما يحدث غالباً عندما أنشر أشياء كهذه، فإن الإجابة أكثر غرابة مما كنت أتخيل.

إذا استخدمت أشياء مثل {{#if server.value}} وقمت بدفع value عبر MessageBus، فإن الأمر يعمل كما هو متوقع عند إجراء تحديث من وحدة تحكم Rails. يمكنني تعيينه إلى nil/ليس nil، وتختفي (أو تظهر) قسم الصفحة كما هو متوقع. عند تشغيل مهمة Ansible من طرفية، يقوم Ansible بدفع قيمة جديدة عبر مسار معين، مما يحدث السجل، ثم يدفعه إلى MessageBus، فيظهر قسم القالب كما هو متوقع.

لكن، إذا تم تشغيل Ansible بواسطة مهمة من Discourse، فإنني ما زلت أرى Rails تدعي أنها تدفع الأشياء إلى MessageBus. وأرى في وحدة تحكم JavaScript للمتصفح أن دالة محسوبة تتعقب هذه القيمة تعمل، وأن القيمة هي null. إذا قمت بإعادة تحميل المتصفح، تكون البيانات موجودة وتُعرض الصفحة كما هو متوقع. ربما يكون هذا مجرد غرابة في بيئة التطوير، وسيكون الأمر مختلفاً في بيئة الإنتاج.

ربما يكون هذا مرتبطاً بهذا؟

حسناً، ما زلت قلقاً بشأن هذا الخطأ، لكنني أضفت

         window.location.reload(true);

إلى الإجراء الخاص بي، فتتم إعادة تحميل الصفحة ويبدو أن كل شيء يعمل بعد ذلك.

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