saurabhmasc
(Saurabh Khandelwal)
9. März 2020 um 11:06
1
Hallo zusammen,
ich möchte die Ember-Route-Klasse (/app/assets/javascripts/discourse/routes/tags-show.js.es6) auf dieselbe Weise modifizieren, wie wir Controller- und Component-Klassen über pluginAPI ändern.
Ein Beispiel, wie wir den Composer-Controller in composer.js.es6 ändern:
<script type="text/discourse-plugin" version="0.8">
api.modifyClass('controller:composer', {
actions: {
newActionHere() { }
}
});
</script>
Ist es möglich, die Ember-Route-Klasse auf dieselbe Weise zu ändern?
justin
(Justin DiRose)
9. März 2020 um 13:27
2
Ich glaube, das ist möglich – ich denke, es funktioniert über route:route-name. Hast du es schon ausprobiert?
saurabhmasc
(Saurabh Khandelwal)
9. März 2020 um 14:16
3
route:route-name funktioniert, aber wenn ich versuche, die Aktion createTopic wie unten gezeigt zu überschreiben:
<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(() => {
// Tags-Eingabefeld vorfüllen
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>
Dabei wird der folgende Fehler ausgelöst:
ReferenceError: Composer ist nicht definiert
Johani
(Joe)
10. März 2020 um 22:12
4
Dies liegt daran, dass Composer in deinem Code nicht definiert ist. Wenn du dir die Route tags-show ansiehst, wirst du feststellen, dass Composer oben definiert ist.
https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/routes/tags-show.js.es6#L2
Da du dies jedoch in Skript-Tags eines Themes ausführst, kannst du import nicht verwenden. Stattdessen musst du require verwenden.
Es sollte also funktionieren, wenn du etwas wie Folgendes an den Anfang deines Codes fügst:
const Composer = require("discourse/models/composer");
Trotzdem empfehle ich dir dringend, dir etwas Zeit zu nehmen, um
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,…
zu lesen und mit dieser neuen Methode zur Erstellung von Themes zu experimentieren. Auf diese Weise lassen sich Beispiele aus dem Kern viel leichter nachvollziehen.