Puis-je utiliser routeAction dans les composants Glimmer en fichier unique ?

Je peux utiliser l’assistant route-action dans les fichiers de modèle .hbs comme ceci :

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

Puis-je utiliser la même déclaration dans un fichier de modèle glimmer ? J’ai essayé ceci mais cela ne fonctionne pas :

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

[...]

{{on \"click\" routeAction \"showLogin\"}}
2 « J'aime »

Dans un composant Glimmer, je pense que vous n’avez pas besoin de l’aide. Vous pouvez le faire directement :

{{on "click" this.showLogin}}

Si vous avez besoin de passer des arguments :

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

Il recherchera l’action :

@action
showLogin(<argument>, event) {}
3 « J'aime »

Merci @Arkshine ! Je pense comprendre comment passer des actions dans un composant Glimmer en général. Cependant, l’aide route-action s’est déplacée le long de la hiérarchie des routes pour invoquer une action qui n’est pas déclarée dans la portée locale. Vous pourriez donc simplement la déclarer sur le composant, par exemple :

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

Je pourrais simplement travailler sur le template, me soucier moins de la logique invoquée car elle est automatiquement transmise (de mon point de vue :). Ce que j’aimais, mais je ne comprends pas si c’était une bonne pratique et si/comment j’y aurais accès maintenant dans un composant Glimmer.

Vous avez raison ; c’est de ma faute. :pensive: J’ai répondu automatiquement sans trop réfléchir. (enfin, il était 5h du matin :smile:).
Je n’ai pas la réponse à votre question pour le moment, mais je reviendrai vers vous si je trouve quelque chose de mon côté !

1 « J'aime »

D’après mes tests, ce qui suit fonctionne.

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

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

Cela suppose que vous avez le service router défini dans le composant.

Je ne suis pas sûr si cela est considéré comme une mauvaise pratique. Cela ne semble pas être une bonne idée, mais ça fonctionne. :smile:

3 « J'aime »

Merci encore ! Je suis d’accord, ça a l’air un peu artisanal :smile: Bien que ça ne fonctionne pas non plus pour moi… j’essaie de remplacer l’action dans discourse-featured-lists/javascripts/discourse/components/featured-list.gjs at main · nolosb/discourse-featured-lists · GitHub

Bon, je vais peut-être laisser tomber pour l’instant, le composant fonctionne bien tel quel. J’essaie juste de mieux comprendre comment certaines choses fonctionnent en coulisses :mechanic:t4:

Je pense que si vous utilisez l’exportation par défaut, cela devrait fonctionner comme prévu (c’est-à-dire sans avoir besoin d’injecter le service routeur, ou de lui passer manuellement une référence)

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

(Je ne suis pas sûr pourquoi il y a aussi une fonction interne exportée sous le nom de routeAction… assez déroutant ! Corrigeons cela)

Bien que je dirais… en général, nous essayons de nous orienter vers des « actions de fermeture » comme {{on \"click\" this.someFunction}} plutôt que vers des choses basées sur des chaînes comme {{action \"blah\"}} ou {{routeAction \"blah\"}}.

3 « J'aime »