Переклассифицирую это как баг.
Я добавил 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