könnte mir jemand bitte raten, wie man sich aus einer Funktion heraus auf api.addPosterIcon bezieht?
Beispiel:
<script type="text/discourse-plugin" version="0.8">
api.onPageChange(url => {
if (Discourse?.currentUser?.admin) {
extract_associated_user_data();
}
});
function extract_associated_user_data() {
// viel Code oben, und jetzt sind wir bereit, die Funktion `addPosterIcon` aufzurufen
api.addPosterIcon(function(data, attrs) {
return { icon: 'user', className: 'customer' };
});
}
</script>
Wenn api.addPosterIcon auf die oberste Ebene verschoben wird, funktioniert es. Wenn es jedoch aus extract_associated_user_data heraus aufgerufen wird, passiert einfach nichts (es wird nicht ausgeführt). Vielleicht wird this intern durcheinandergebracht, aber ich bin mir nicht sicher, wie man sich darauf beziehen soll. Ich habe vor dem Posten schon viele Dinge ausprobiert.
Ich hoffe, das wird auch für zukünftige Entwickler-Leser nützlich sein.
Wir nutzen die neueste Version von Discourse 2.8.0.beta6 (cba8b39607).
Die Implementierung von text/discourse-plugin-Snippets in Themes erfolgt offenbar wie folgt:
Ich sehe hier keinen direkten Hinweis auf eine this-Instanz, was darauf hindeuten würde, dass es nicht mit dem impliziten this in JS zusammenhängt. Auch kann es nicht sein, dass api den Gültigkeitsbereich verlässt, da das Snippet dort eingefügt wird.
Funktioniert dieses Minimalbeispiel tatsächlich, oder liegt das Problem nicht im weggelassenen Code?
Nebenbei: Das globale Discourse-Objekt und dessen Feld currentUser könnten hier ebenfalls durch api.getCurrentUser() ersetzt werden: