Спасибо @Arkshine! Я думаю, что в целом понял, как передавать действия в компоненте Glimmer. Однако хелпер route-action перемещается по иерархии маршрутов для вызова действия, которое не объявлено в локальной области видимости. Так что вы можете просто объявить его в компоненте, например:
Я мог бы просто работать с шаблоном, меньше беспокоясь о вызываемой логике, поскольку она автоматически передаётся (с моей точки зрения :). Мне это нравилось, но я не понимаю, было ли это когда-либо лучшей практикой и как/имею ли я сейчас доступ к этому в компоненте Glimmer.
Ты прав, моя вина. Я ответил автоматически, не особо задумываясь. (ну, было 5 утра ).
Сейчас у меня нет ответа на твой вопрос, но я вернусь к тебе, если разберусь в этом на своей стороне!
По результатам моего теста, следующее решение работает.
import { get } from "@ember/object";
import { routeAction } from 'discourse/helpers/route-action';
{{on "click" (routeAction "showLogin" (get this "router._router"))}}
Предполагается, что у вас в компоненте определена служба router.
Не уверен, считается ли это плохой практикой. Звучит не как хорошая идея, но работает.
Возможно, я просто пока откажусь от этой идеи, компонент работает нормально и так. Просто пытаюсь немного лучше понять, как некоторые вещи работают под капотом
Думаю, если использовать экспорт по умолчанию, всё должно работать как ожидается (то есть без необходимости внедрять службу router или вручную передавать на неё ссылку).
import routeAction from "discourse/helpers/route-action";
(не совсем понятно, почему также экспортируется внутренняя функция под именем routeAction… довольно запутанно! Давайте это исправим)
Хотя, если говорить в целом, мы стремимся переходить к «закрытым действиям» (closure actions), таким как {{on "click" this.someFunction}}, а не к строковым конструкциям вроде {{action "blah"}} или {{routeAction "blah"}}.