¿Puedo usar routeAction en componentes de archivo único de glimmer?

Puedo usar el helper route-action en archivos de plantilla .hbs de esta manera:

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

¿Puedo usar la misma declaración en un archivo de plantilla de Glimmer? Intenté esto pero no funciona:

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

[...]

{{on "click" routeAction "showLogin"}}
2 Me gusta

En un componente de Glimmer, creo que no necesitas el helper. Puedes hacerlo directamente:

{{on "click" this.showLogin}}

Si necesitas pasar argumentos:

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

Buscará la acción:

@action
showLogin(<argument>, event) {}
3 Me gusta

¡Gracias @Arkshine! Creo que entiendo cómo pasar acciones en un componente de Glimmer en general. Sin embargo, el helper route-action se movió a lo largo de la jerarquía de rutas para invocar una acción que no está declarada en el ámbito local. Así que podrías simplemente declararla en el componente, por ejemplo:

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

Podría simplemente trabajar en la plantilla, preocuparme menos por la lógica invocada porque se pasa automáticamente (desde mi punto de vista :). Lo cual me gustó, pero no entiendo si alguna vez fue una buena práctica y si/cómo tendría acceso a eso ahora en un componente de Glimmer.

Tienes razón; me equivoqué. :pensive: Respondí automáticamente sin pensar mucho. (bueno, eran las 5 am :smile:).
No tengo la respuesta a tu pregunta ahora mismo, ¡pero te responderé si descubro algo por mi parte!

1 me gusta

Según mi prueba, lo siguiente funciona.

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

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

Asume que tienes el servicio router definido en el componente.

No estoy seguro de si se considera una mala práctica. No suena como una buena idea, pero funciona. :smile:

3 Me gusta

¡Gracias de nuevo! Estoy de acuerdo en que parece un poco improvisado :smile: Aunque tampoco me funciona… intentando reemplazar la acción en discourse-featured-lists/javascripts/discourse/components/featured-list.gjs at main · nolosb/discourse-featured-lists · GitHub

Bueno, puede que lo deje por ahora, el componente funciona bien tal como está. Solo intento entender un poco mejor cómo funcionan algunas de las cosas internas :mechanic:t4:

Creo que si usas la exportación predeterminada, debería funcionar como se espera (es decir, sin necesidad de inyectar el servicio router, o pasarle manualmente una referencia a él)

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

(no estoy seguro de por qué también hay una función interna exportada como routeAction… ¡bastante confuso! Vamos a arreglar eso)

Aunque diría que… en general estamos tratando de avanzar hacia las ‘closure actions’ como {{on \"click\" this.someFunction}} en lugar de cosas basadas en cadenas como {{action \"blah\"}} o {{routeAction \"blah\"}}.

3 Me gusta