Kann ich routeAction in Glimmer Single-File-Komponenten verwenden?

Ich kann den route-action-Helper in .hbs-Template-Dateien wie folgt verwenden:

@action={{route-action "showLogin"}}

Kann ich die gleiche Deklaration in einer Glimmer-Template-Datei verwenden? Ich habe dies versucht, aber es funktioniert nicht:

import { routeAction } from 'discourse/helpers/route-action';

[...]

{{on "click" routeAction "showLogin"}}
2 „Gefällt mir“

In einer Glimmer-Komponente brauchen Sie den Helfer meiner Meinung nach nicht. Sie können dies direkt tun:

{{on "click" this.showLogin}}

Wenn Sie Argumente übergeben müssen:

{{on "click" (fn this.showLogin <argument>)}}

Es wird nach der Aktion suchen:

@action
showLogin(<argument>, event) {}
3 „Gefällt mir“

Vielen Dank, @Arkshine! Ich glaube, ich verstehe, wie man Aktionen in einer Glimmer-Komponente im Allgemeinen übergibt. Der route-action-Helper wurde jedoch entlang der Routenhierarchie verschoben, um eine Aktion aufzurufen, die nicht im lokalen Gültigkeitsbereich deklariert ist. Sie könnten sie also einfach in der Komponente deklarieren, z. B.:

{{route-action "showLogin"}}
{{route-action "showCreateAccount"}}
{{route-action "composePrivateMessage"}}

Ich könnte einfach an der Vorlage arbeiten und mich weniger um die aufgerufene Logik kümmern, da sie (aus meiner Sicht :)) automatisch übergeben wird. Das gefiel mir, aber ich verstehe nicht, ob das jemals Best Practice war und ob/wie ich jetzt in einer Glimmer-Komponente darauf zugreifen würde.

Du hast Recht; mein Fehler. :pensive: Ich habe ohne viel nachzudenken automatisch geantwortet. (Nun ja, es war 5 Uhr morgens :smile:).
Ich habe im Moment keine Antwort auf deine Frage, aber ich melde mich bei dir, wenn ich auf meiner Seite etwas herausfinde!

1 „Gefällt mir“

Aus meinem Test funktioniert Folgendes.

import { get } from "@ember/object";
import { routeAction } from 'discourse/helpers/route-action';

{{on "click" (routeAction "showLogin" (get this "router._router"))}}

Es wird davon ausgegangen, dass Sie den router-Dienst in der Komponente definiert haben.

Ich bin mir nicht sicher, ob dies als schlechte Praxis gilt. Es klingt nicht nach einer guten Idee, aber es funktioniert. :smile:

3 „Gefällt mir“

Danke nochmal! Ich stimme zu, dass es etwas provisorisch aussieht :smile: Obwohl es bei mir auch nicht funktioniert… Ich versuche, die Aktion in discourse-featured-lists/javascripts/discourse/components/featured-list.gjs at main · nolosb/discourse-featured-lists · GitHub zu ersetzen

Nun, ich lasse es vielleicht erstmal, die Komponente funktioniert so wie sie ist. Ich versuche nur, ein wenig besser zu verstehen, wie einige Dinge unter der Haube funktionieren :mechanic:t4:

Ich denke, wenn Sie den Standardexport verwenden, sollte er wie erwartet funktionieren (d. h. ohne den Router-Dienst injizieren oder manuell eine Referenz darauf übergeben zu müssen)

import routeAction from "discourse/helpers/route-action";

(Ich bin mir nicht sicher, warum es auch eine interne Funktion gibt, die als routeAction exportiert wird … ziemlich verwirrend! Lassen Sie uns das beheben)

Obwohl ich sagen würde … im Allgemeinen versuchen wir, uns in Richtung ‘Closure Actions’ zu bewegen, wie {{on \"click\" this.someFunction}}, anstatt zeichenbasierte Dinge wie {{action \"blah\"}} oder {{routeAction \"blah\"}}.

3 „Gefällt mir“