Bonjour à tous,
Je souhaite modifier la classe Ember Route (/app/assets/javascripts/discourse/routes/tags-show.js.es6) de la même manière que nous modifions les classes Controller et Component en utilisant pluginAPI.
Voici un exemple de modification du contrôleur composer.js.es6 :
<script type="text/discourse-plugin" version="0.8">
api.modifyClass('controller:composer', {
actions: {
newActionHere() { }
}
});
</script>
Est-il possible de modifier la classe Ember Route de la même manière ?
justin
(Justin DiRose)
Mars 9, 2020, 1:27
2
Je pense que c’est possible — je crois que cela fonctionne via route:nom-de-route. Avez-vous essayé ?
route:route-name fonctionne, mais lorsque j’essaie de remplacer l’action createTopic comme ci-dessous :
<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(() => {
// Pré-remplir le champ de saisie des 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>
Une erreur est levée :
ReferenceError : Composer n'est pas défini
Johani
(Joe)
Mars 10, 2020, 10:12
4
Cela se produit parce que Composer n’est pas défini dans votre code. Si vous consultez la route tags-show, vous verrez que Composer est défini tout en haut.
https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/routes/tags-show.js.es6#L2
Cependant, comme vous effectuez cette opération dans des balises de script de thème, vous ne pouvez pas utiliser import. Vous devrez utiliser require à la place.
Ainsi, cela devrait fonctionner si vous ajoutez quelque chose comme ceci au début de votre code :
const Composer = require("discourse/models/composer");
Cela dit, je vous recommande vivement de prendre un peu de temps pour lire
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,…
et d’expérimenter cette nouvelle façon de créer des thèmes. Il est beaucoup plus facile de suivre les exemples du noyau de cette manière.