Posso usar routeAction em componentes glimmer de arquivo único?

Posso usar o helper route-action em arquivos de template .hbs assim:

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

Posso usar a mesma declaração em um arquivo de template glimmer? Tentei isto mas não funciona:

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

[...]

{{on "click" routeAction "showLogin"}}
2 curtidas

Em um componente Glimmer, acredito que você não precise do helper. Você pode fazer isso diretamente:

{{on "click" this.showLogin}}

Se precisar passar argumentos:

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

Ele procurará a ação:

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

Obrigado @Arkshine! Acho que entendi como passar ações em um componente Glimmer em geral. No entanto, o helper route-action se moveu pela hierarquia de rotas para invocar uma ação que não é declarada no escopo local. Então você poderia apenas declará-la no componente, por exemplo:

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

Eu poderia apenas trabalhar no template, me importar menos com a lógica invocada porque ela é passada magicamente (do meu ponto de vista :). O que eu gostei, mas não entendo se essa já foi a melhor prática e se/como eu teria acesso a isso agora em um componente Glimmer.

Você tem razão; foi mal. :pensive: Respondi automaticamente sem pensar muito. (bem, eram 5 da manhã :smile:).
Não tenho a resposta para sua pergunta agora, mas entrarei em contato se descobrir algo do meu lado!

1 curtida

Dos meus testes, o seguinte funciona.

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

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

Pressupõe que você tenha o serviço router definido no componente.

Não tenho certeza se é considerado uma má prática. Não parece uma boa ideia, mas funciona. :smile:

3 curtidas

Obrigado novamente! Concordo que parece um pouco improvisado :smile: Embora também não funcione para mim… tentando substituir a ação em discourse-featured-lists/javascripts/discourse/components/featured-list.gjs at main · nolosb/discourse-featured-lists · GitHub

Bem, talvez eu desista por enquanto, o componente funciona bem como está. Apenas tentando entender um pouco melhor como algumas coisas funcionam nos bastidores :mechanic:t4:

Acho que se você usar a exportação padrão, isso deve funcionar como esperado (ou seja, sem precisar injetar o serviço router, ou passar manualmente uma referência para ele)

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

(não tenho certeza por que também há uma função interna exportada como routeAction… bastante confuso! Vamos consertar isso)

Embora eu diria… em geral, estamos tentando nos mover em direção a ‘closure actions’ como {{on \"click\" this.someFunction}} em vez de coisas baseadas em strings como {{action \"blah\"}} ou {{routeAction \"blah\"}}.

3 curtidas