saurabhmasc
(Saurabh Khandelwal)
Março 9, 2020, 11:06am
1
Olá a todos,
Gostaria de modificar a classe Ember Route (/app/assets/javascripts/discourse/routes/tags-show.js.es6) da mesma forma que modificamos as classes Controller e Component usando pluginAPI.
Um exemplo de como modificamos o controller composer.js.es6 está abaixo:
<script type="text/discourse-plugin" version="0.8">
api.modifyClass('controller:composer', {
actions: {
newActionHere() { }
}
});
</script>
É possível modificar a classe Ember Route da mesma maneira?
justin
(Justin DiRose)
Março 9, 2020, 1:27pm
2
Acredito que isso seja possível — acho que funciona via route:route-name. Você já tentou?
saurabhmasc
(Saurabh Khandelwal)
Março 9, 2020, 2:16pm
3
route:route-name funciona, mas quando tento sobrescrever a ação createTopic como mostrado abaixo:
<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(() => {
// Preencher o campo de entrada de tags
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>
Ele lança o erro:
ReferenceError: Composer is not defined
Johani
(Joe)
Março 10, 2020, 10:12pm
4
Isso ocorre porque Composer não está definido no seu código. Se você observar a rota tags-show, verá que Composer é definido no início.
https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/routes/tags-show.js.es6#L2
No entanto, como você está fazendo isso em tags de script de tema, não pode usar import. Você terá que usar require em vez disso.
Portanto, deve funcionar se você adicionar algo assim no início do seu código:
const Composer = require("discourse/models/composer");
Dito isso, recomendo fortemente que você dedique um tempo para ler
Temas complexos em JavaScript podem ser divididos em vários arquivos, para manter as coisas bem organizadas.
Para usar essa funcionalidade, basta adicionar arquivos à pasta /javascripts no diretório do seu tema. Esses arquivos não podem ser editados na interface do Discourse, portanto, você deve usar o Theme CLI ou fazer o source do tema via git .
Arquivos JavaScript são tratados exatamente da mesma forma que em core/plugins, então você deve seguir a mesma estrutura de arquivo/pasta. Os arquivo…
e experimentar essa nova maneira de criar temas. Dessa forma, é muito mais fácil seguir exemplos do núcleo.