api.modifyClass تعمل أحيانًا (!) بشكل غير صحيح

تعديل: تم إعادة تصنيفه كخطأ.
إعادة إنتاج كاملة أدناه.

أنا أستخدم api.modifyClass في مكون سمة.
على معظم الصفحات، يعمل هذا بشكل جيد، ولكن في بعض المواضيع، لا تتم إضافة الخاصية إلى نموذج المستخدم عند إعادة تحميل الصفحة. لا يمكنني العثور على سبب عمله في معظم المواضيع، ولكنه لا يعمل في البعض الآخر، أو ما تشترك فيه المواضيع التي لا يعمل فيها.
هل يفهم أي شخص ما الذي أفعله بشكل خاطئ هنا؟

ملخص: إضافة api.container.lookup للنموذج، أسفل modifyClass، يعمل على تجاوز هذه المشكلة.

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

يا إلهي. قد أعرف!\n\nأعتقد أنك بحاجة إلى إضافة pluginId\n\n <script type=\"text/discourse-plugin\" version=\"0.1\">\n api.modifyClass('model:user', {\n pluginId: 'my-plugin', \n testProperty: function() {\n return 1;\n } \n });\n</script>\n\n\n\nإنه مطلوب في الإصدارات اللاحقة، لقد قدمت بالفعل طلبات سحب لعدد قليل من السمات أمس لإضافة هذا. قد أتحول أخيرًا إلى مطور إضافات/سمات.

إعجابَين (2)

شكراً لك جاي! لقد أحدث ذلك فرقاً بالفعل في نسخة الاختبار الخاصة بي.
لكن للأسف، هذا ليس حلاً سحرياً لكل شيء، المشكلة لا تزال قائمة :frowning:

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

نعم، pluginId موجود لمنع تطبيق التعديلات مرتين، على ما أعتقد. ألا ينبغي أن يفسر عدم وجوده عدم تشغيله مرة واحدة؟

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

تباً. فقط عندما اعتقدت أنني أعرف شيئاً ما. :crying_cat_face:

اعتقدت ربما إذا كان هناك شيء آخر يعدل الفئة فقد تكون هناك حالة سباق لمعرفة أي منها قام بذلك. لكن جافاسكريبت لا تزال لغزاً بالنسبة لي إلى حد كبير.

إعجابَين (2)

لا تزال مشكلة في الكود، لذا من المنطقي طرحها.

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

نعم، هذا ما خطر ببالي أيضاً. لكن هذا لا يزال يفشل على موقع اختبار مع هذا كمكون السمة الوحيد.

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

للتوضيح، إذا أضفت هذا إلى مكون سمة في على سبيل المثال:

  • /javascripts/discourse/initializers/test-init.js.es6

هل يتغير السلوك/يتحسن؟

لست متأكدًا مما إذا كانت هذه الأشياء متطابقة دلاليًا …

… نظريًا، يجب تقييم كليهما عند تحديث المتصفح، وبعد ذلك يجب أن يكون شرط السباق غير ذي صلة عند انتقال المسار حيث يجب أن يكون التعديل قد تم تطبيقه بالفعل …

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

لا، نفس السلوك.

لقد قمت بإنشاء مكون سمة باستخدام javascripts/discourse-test/initializers/initialize-discourse-test.js.es6:

import { withPluginApi } from "discourse/lib/plugin-api";

export default {
  name: 'discourse-test-initializer',
  initialize(){
    console.log('here1');
    withPluginApi("0.1", api => {
      console.log('here2');

      api.modifyClass('model:user', {
        pluginId: 'test',
        testFunction: function() {
          console.log('here3');
          return 2;
        }
      });

    });
  }
}

يطبع

here1
here2

على كل صفحة.

في بعض المواضيع، يعمل إدخال Discourse.currentUser.testFunction() في وحدة التحكم ويعطي here3 و 2 كمخرجات.

في بعض المواضيع لا يعمل (Uncaught TypeError: Discourse.currentUser.testFunction is not a function)

إعجابَين (2)

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

إن إضافة المقتطف التالي أسفل الكود الذي لا يعمل قد حل المشكلات التي كنت أواجهها باستمرار. لقد اختبرت هذا على منتديات مستقلة متعددة، على كل من الإصدار المستقر وإصدارات tests-passed. أعتقد أنه يجب إعادة تصنيف هذا على أنه Bug

<script type="text/discourse-plugin" version="0.1">
const userModel = api.container.lookup("model:user");
</script>

@Johani شكرًا لك على مساعدتك!

إعجابَين (2)

إعادة تصنيف هذا على أنه خطأ.

لقد أضفت console.log في كود واجهة برمجة تطبيقات المكون الإضافي app/assets/javascripts/discourse/app/lib/plugin-api.js حتى يتم تسجيل كلما تم استدعاء modifyClass.

لقد قمت بإزالة جميع المكونات الإضافية الخارجية للتأكد من عدم وجود تعارض في مكان ما.

إعادة الإنتاج:

  • إنشاء منتدى فارغ على stable (بدون Ember CLI). هذا لا يعمل أيضًا على tests-passed (بدون Ember CLI). لم أختبر هذا مع Ember CLI.

  • إضافة مكون سمة مع هذا في Common - Head

#1 يعمل


    api.modifyClass('model:user', {
      pluginId: 'test-tc',
      testFunction: function() {
        return 1;
      }
    });

  • تحميل الصفحة الرئيسية

  • تعرض وحدة التحكم modifyClass called for model:user _application-08d9058ddd37ba80992f770509f4919ad0738a17f14fb85167b1dc1f32f8b56e.js:23490:16 Object { pluginId: "test-tc", testFunction: testFunction() }

  • أدخل Discourse.currentUser.testFunction() في وحدة التحكم

  • تتم طباعة “1”

#2 فشل

  • انتقل إلى موضوع، على سبيل المثال “Welcome to Discourse” وأعد تحميل الصفحة
  • تعرض وحدة التحكم نفس سجلات “modifyClass called”
  • أدخل Discourse.currentUser.testFunction() في وحدة التحكم
  • تتم طباعة Uncaught TypeError: Discourse.currentUser.testFunction is not a function

#3 فشل مع تحذير

  • أضف سطرًا واحدًا إلى أعلى مكون السمة ليبدو كالتالي:

    const userModel = api.container.lookup("model:user");

    api.modifyClass('model:user', {
      pluginId: 'test-tc',
      testFunction: function() {
        return 1;
      }
    });

  • انتقل إلى موضوع، على سبيل المثال “Welcome to Discourse” وأعد تحميل الصفحة
  • تعرض وحدة التحكم نفس سجلات “modifyClass called”
  • تعرض وحدة التحكم تحذيرًا \"model:user\" was already cached in the container. Changes won't be applied.
  • أدخل Discourse.currentUser.testFunction() في وحدة التحكم
  • تتم طباعة Uncaught TypeError: Discourse.currentUser.testFunction is not a function

#4 يعمل

  • انقل سطر البحث إلى أسفل مكون السمة ليبدو كالتالي:

    api.modifyClass('model:user', {
      pluginId: 'test-tc',
      testFunction: function() {
        return 1;
      }
    });

    const userModel = api.container.lookup("model:user");

  • انتقل إلى موضوع، على سبيل المثال “Welcome to Discourse” وأعد تحميل الصفحة
  • تعرض وحدة التحكم نفس سجلات “modifyClass called”
  • أدخل Discourse.currentUser.testFunction() في وحدة التحكم
  • تتم طباعة “1” :partying_face:
4 إعجابات

إعادة النظر في هذا:

على Discourse 2.8 وما فوق، باستخدام Discourse.User.current().testFunction() ، لا تزال الحالة #2 تفشل.

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

لدي مشكلة مع modifyClass أيضًا، لست متأكدًا مما إذا كان الأمر يتعلق بها: Issues overriding getters in a controller (3.0.0)

لقد قمت للتو بتحسين التحذير الخاص بنا لهذا النوع من المواقف:

وكتبت أيضًا هذه الوثائق التي تشرح السبب وكيفية حلها:

أعتقد أن هذا سيعالج جميع المخاوف في هذا الموضوع. إذا لم يكن الأمر كذلك، فيرجى مشاركة بعض الأمثلة على التعليمات البرمجية الفاشلة وسألقي نظرة.

11 إعجابًا

تم إغلاق هذا الموضوع تلقائيًا بعد 3 أيام. لم يعد يُسمح بالردود الجديدة.