api.modifyClass иногда (!) не работает

Переклассифицирую это как баг.

Я добавил console.log в код API плагинов app/assets/javascripts/discourse/app/lib/plugin-api.js, чтобы он выводил сообщение каждый раз, когда вызывается modifyClass.

Я удалил все внешние плагины, чтобы убедиться, что конфликта нигде нет.

Воспроизведение:

  • создайте пустой форум на ветке stable (без Ember CLI). Это также не работает на ветке tests-passed (без Ember CLI). Я не тестировал это с Ember CLI.

  • добавьте компонент темы со следующим кодом в раздел Common - Head

#1 Работает

<script type="text/discourse-plugin" version="0.1">
    api.modifyClass('model:user', {
      pluginId: 'test-tc',
      testFunction: function() {
        return 1;
      } 
    });
</script>
  • загрузите главную страницу

  • в консоли появится сообщение: modifyClass called for model:user _application-08d9058ddd37ba80992f770509f4919ad0738a17f14fb85167b1dc1f32f8b56e.js:23490:16 Object { pluginId: "test-tc", testFunction: testFunction() }

  • введите в консоли Discourse.currentUser.testFunction()

  • будет выведено значение 1

#2 Не работает

  • перейдите к любой теме, например, “Добро пожаловать в Discourse”, и обновите страницу
  • в консоли появятся те же логи с сообщением “modifyClass called”
  • введите в консоли Discourse.currentUser.testFunction()
  • будет выведено сообщение об ошибке: Uncaught TypeError: Discourse.currentUser.testFunction is not a function

#3 Не работает с предупреждением

  • добавьте одну строку в начало компонента темы, чтобы он выглядел так:
<script type="text/discourse-plugin" version="0.1">
    const userModel = api.container.lookup("model:user");

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

</script>
  • перейдите к любой теме, например, “Добро пожаловать в 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 Работает

  • переместите строку lookup в конец компонента темы, чтобы он выглядел так:
<script type="text/discourse-plugin" version="0.1">
    api.modifyClass('model:user', {
      pluginId: 'test-tc',
      testFunction: function() {
        return 1;
      } 
    });

    const userModel = api.container.lookup("model:user");
</script>
  • перейдите к любой теме, например, “Добро пожаловать в Discourse”, и обновите страницу
  • в консоли появятся те же логи с сообщением “modifyClass called”
  • введите в консоли Discourse.currentUser.testFunction()
  • будет выведено значение 1 :partying_face:
4 лайка