Glimmerの単一ファイルコンポーネントでrouteActionを使用できますか?

.hbs テンプレートファイルでは、次のように route-action ヘルパーを使用できます。

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

同じ宣言を Glimmer テンプレートファイルで使用できますか?次のように試しましたが、うまくいきませんでした。

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

[...]

{{on "click" routeAction "showLogin"}}
「いいね!」 2

Glimmerコンポーネントでは、ヘルパーは不要で、直接次のように記述できると思います。

{{on "click" this.showLogin}}

引数を渡す必要がある場合は、次のようになります。

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

アクションを探します。

@action
showLogin(<argument>, event) {}
「いいね!」 3

@Arkshineさん、ありがとうございます!Glimmerコンポーネントでアクションを渡す方法については、全体的に理解できたと思います。しかし、route-actionヘルパーは、ローカルスコープで宣言されていないアクションを呼び出すために、ルート階層に沿って移動しました。そのため、コンポーネントで宣言するだけで済みます。たとえば、次のようになります。

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

テンプレートで作業するだけで、呼び出されるロジックについては(私の視点では自動的に渡されるので :))あまり気にする必要がありませんでした。それは気に入っていましたが、それが常にベストプラクティスであったのか、そして現在Glimmerコンポーネントでそれにアクセスする方法があるのかどうかは理解できません。

おっしゃる通りです。私のミスです。:pensive: あまり考えずに自動で回答してしまいました。(まあ、朝の5時でしたからね :smile:)
現時点ではご質問への回答はありませんが、何か分かりましたら改めてご連絡します!

「いいね!」 1

テストしたところ、以下のものが機能しました。

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

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

これは、コンポーネントに router サービスが定義されていることを前提としています。

これが悪い習慣と見なされるかどうかはわかりません。良い考えとは思えませんが、機能します。:smile:

「いいね!」 3

またありがとうございます!少しハッキーに見えることにも同意します :smile: しかし、私にとっても機能しません。discourse-featured-lists/javascripts/discourse/components/featured-list.gjs at main · nolosb/discourse-featured-lists · GitHub でアクションを置き換えようとしています。

まあ、今はやめるかもしれませんが、コンポーネントは現状でうまく機能しています。内部でどのように機能するかをもう少し理解しようとしているだけです :mechanic:t4:

デフォルトエクスポートを使用すれば、ルーターサービスを注入したり、手動で参照を渡したりする必要がなく、期待どおりに動作するはずだと思います。

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

routeAction として内部関数もエクスポートされている理由がわかりません…非常に紛らわしいです!それを修正しましょう

ただし、一般的には {{action \"blah\"}}{{routeAction \"blah\"}} のような文字列ベースのものよりも、{{on \"click\" this.someFunction}} のような「クロージャアクション」に向かっていると言えます。

「いいね!」 3