saurabhmasc
(Saurabh Khandelwal)
9 Marzo 2020, 11:06am
1
Ciao a tutti,
Voglio modificare la classe Ember Route (/app/assets/javascripts/discourse/routes/tags-show.js.es6) nello stesso modo in cui modifichiamo le classi Controller e Component utilizzando pluginAPI.
Un esempio di come modifichiamo il controller composer.js.es6 è il seguente:
<script type="text/discourse-plugin" version="0.8">
api.modifyClass('controller:composer', {
actions: {
newActionHere() { }
}
});
</script>
È possibile modificare la classe Ember Route nello stesso modo?
justin
(Justin DiRose)
9 Marzo 2020, 1:27pm
2
Credo che sia possibile — penso che funzioni tramite route:route-name. L’hai già provato?
saurabhmasc
(Saurabh Khandelwal)
9 Marzo 2020, 2:16pm
3
route:route-name funziona, ma quando provo a sovrascrivere l’azione createTopic come mostrato di seguito:
<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(() => {
// Pre-compila il campo di input dei tag
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>
Viene generato l’errore:
ReferenceError: Composer non è definito
Johani
(Joe)
10 Marzo 2020, 10:12pm
4
Questo accade perché Composer non è definito nel tuo codice. Se guardi la rotta tags-show, vedrai che Composer è definito all’inizio.
https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/routes/tags-show.js.es6#L2
Tuttavia, dato che stai facendo questo nei tag script del tema, non puoi usare import. Dovrai usare require invece.
Quindi, dovrebbe funzionare se aggiungi qualcosa del genere all’inizio del tuo codice
const Composer = require("discourse/models/composer");
Detto questo, ti consiglio vivamente di dedicare un po’ di tempo alla lettura di
I temi complessi di JavaScript possono essere suddivisi in più file, per mantenere le cose ben organizzate.
Per utilizzare questa funzionalità, è sufficiente aggiungere file alla cartella /javascripts nella directory del tema. Questi file non possono essere modificati dall’interfaccia utente di Discourse, quindi è necessario utilizzare la Theme CLI o caricare il tema da git .
I file Javascript sono trattati esattamente come quelli in core/plugins, quindi è necessario seguire la stessa struttura…
e a sperimentare questo nuovo modo di creare i temi. È molto più facile seguire gli esempi nel core in questo modo.