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
Komplexe Themen-JavaScript-Dateien können in mehrere Dateien aufgeteilt werden, um alles schön organisiert zu halten.
Um diese Funktionalität zu nutzen, fügen Sie einfach Dateien zum Ordner /javascripts in Ihrem Theme-Verzeichnis hinzu. Diese Dateien können nicht über die Discourse-UI bearbeitet werden. Sie müssen daher die Theme CLI verwenden oder das Theme über Git beziehen .
JavaScript-Dateien werden genau wie in Core/Plugins behandelt, daher sollten Sie dieselbe Datei-/Ordnerstruktur befolg…
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.