Posso usare routeAction nei componenti single-file di glimmer?

Posso usare l’helper route-action nei file di template .hbs in questo modo:

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

Posso usare la stessa dichiarazione in un file di template glimmer? Ho provato questo ma non funziona:

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

[...]

{{on \"click\" routeAction \"showLogin\"}}
2 Mi Piace

In un componente Glimmer, non credo che tu abbia bisogno dell’helper. Puoi farlo direttamente:

{{on "click" this.showLogin}}

Se devi passare argomenti:

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

Cercherà l’azione:

@action
showLogin(<argument>, event) {}
3 Mi Piace

Grazie @Arkshine! Penso di aver capito come passare azioni in un componente glimmer in generale. Tuttavia, l’helper route-action si è spostato lungo la gerarchia delle route per invocare un’azione che non è dichiarata nello scope locale. Quindi potresti semplicemente dichiararla sul componente, ad esempio:

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

Potrei semplicemente lavorare sul template, preoccupandomi meno della logica invocata perché viene passata automaticamente (dal mio punto di vista :). Cosa che mi piaceva, ma non capisco se quella fosse mai una best practice e se/come potrei accedervi ora in un componente glimmer.

Hai ragione; colpa mia. :pensive: Ho risposto automaticamente senza pensarci molto. (beh, erano le 5 del mattino :smile:).
Al momento non ho la risposta alla tua domanda, ma ti farò sapere se scopro qualcosa da parte mia!

1 Mi Piace

Dai miei test, quanto segue funziona.

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

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

Presuppone che tu abbia il servizio router definito nel componente.

Non sono sicuro se sia considerata una cattiva pratica. Non sembra una buona idea, ma funziona. :smile:

3 Mi Piace

Grazie ancora! Concordo sul fatto che sembri un po’ improvvisato :smile: Anche se non funziona per me.. sto cercando di sostituire l’azione in discourse-featured-lists/javascripts/discourse/components/featured-list.gjs at main · nolosb/discourse-featured-lists · GitHub

Beh, potrei semplicemente lasciar perdere per ora, il componente funziona bene così com’è. Sto solo cercando di capire un po’ meglio come funzionano alcune cose sotto il cofano :mechanic:t4:

Penso che se usi l’esportazione predefinita, dovrebbe funzionare come previsto (cioè senza dover iniettare il servizio router o passargli manualmente un riferimento)

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

(non sono sicuro del perché ci sia anche una funzione interna esportata come routeAction… piuttosto confuso! Risolviamo questo problema)

Anche se direi… in generale stiamo cercando di muoverci verso ‘closure actions’ come {{on \"click\" this.someFunction}} piuttosto che cose basate su stringhe come {{action \"blah\"}} o {{routeAction \"blah\"}}.

3 Mi Piace