saurabhmasc
(Saurabh Khandelwal)
09.Март.2020 11:06:32
1
Всем привет,
Я хочу изменить класс маршрута Ember (/app/assets/javascripts/discourse/routes/tags-show.js.es6) так же, как мы изменяем классы контроллера и компонента с помощью pluginAPI.
Пример изменения контроллера composer.js.es6 представлен ниже:
<script type="text/discourse-plugin" version="0.8">
api.modifyClass('controller:composer', {
actions: {
newActionHere() { }
}
});
</script>
Возможно ли изменить класс маршрута Ember таким же образом?
justin
(Justin DiRose)
09.Март.2020 13:27:14
2
Я считаю, что это возможно — я думаю, это работает через route:route-name. Вы уже пробовали?
saurabhmasc
(Saurabh Khandelwal)
09.Март.2020 14:16:32
3
route:route-name работает, но когда я пытаюсь переопределить действие createTopic , как показано ниже:
<script type="text/discourse-plugin" version="0.8">
api.modifyClass('route:tags-show', {
actions: {
createTopic() {
const controller = this.controllerFor("tags.show");
if (controller.get("list.draft")) {
this.openTopicDraft(controller.get("list"));
} else {
this.controllerFor("composer")
.open({
categoryId: controller.get("category.id"),
action: Composer.CREATE_TOPIC,
draftKey: controller.get("list.draft_key"),
draftSequence: controller.get("list.draft_sequence")
})
.then(() => {
// Заполнить поле ввода тегов
if (controller.get("model.id")) {
const composerModel = this.controllerFor("composer").get("model");
composerModel.set(
"tags",
_.compact(
_.flatten([
controller.get("model.id"),
controller.get("additionalTags")
])
)
);
}
});
}
}
}
});
</script>
Выдает ошибку:
ReferenceError: Composer is not defined
Johani
(Joe)
10.Март.2020 22:12:09
4
Это происходит потому, что Composer не определен в вашем коде. Если вы посмотрите на маршрут tags-show, то увидите, что Composer определен в начале.
https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/routes/tags-show.js.es6#L2
Однако, поскольку вы делаете это в тегах скриптов темы, вы не можете использовать import. Вместо этого вам придется использовать require.
Таким образом, это должно сработать, если вы добавите что-то вроде этого в начало вашего кода:
const Composer = require("discourse/models/composer");
Тем не менее, я настоятельно рекомендую вам потратить немного времени на чтение
Complex theme javascript can be split into multiple files, to keep things nicely organised.
To use this functionality, simply add files to the /javascripts folder in your theme directory. These files can not be edited from the Discourse UI, so you must use the Theme CLI or source the theme from git .
Javascript files are treated exactly the same as they are in core/plugins, so you should follow the same file/folder structure. Theme files are loaded after core/plugins, so if the filenames match,…
и поэкспериментировать с этим новым способом создания тем. Так гораздо проще следовать примерам из ядра.