テンプレートからウィジェットアクションへパラメータを注入できますか?

Developer’s guide to Discourse Themes の議論に続きます:

皆様、

テンプレートからアクションへパラメータを注入できるかどうか疑問に思っており、@Johani のガイドでは肯定的にも否定的にも答えが見つかりませんでした。私の目的は、テンプレートによって複数のウィジェットを生成し、それぞれのアクションが {{#each}} ループのパラメータを知るようにすることです。

例として、カテゴリ通知の多選択肢ボタンを選択した後:

<script type="text/x-handlebars" data-template-name="components/some_component">
{{#each categories as |c|}}
    {{category-notifications-button
        value=c.notification_level
        category=c
        onChange=(action "changeCategoryNotificationLevel" ***somehow_inject_c_as_a_parameter***)
    }}
{{/each}}
</script>
<script type="text/discourse-plugin" version="0.8">
  api.modifyClass("controller:some_component", {
    actions: {
      changeCategoryNotificationLevel(selected_value, ***c_as_a_parameter***) {
        c_as_a_parameter.setNotification(notificationLevel);
      }
    }
  }
});
</script>

テンプレート内から changeCategoryNotificationLevel の中で、現在どのカテゴリにいるかを知る方法はありますか?

もしない場合、私の問題が十分に明確に説明できているなら、同じ結果を達成する別の方法をご存知ありませんか?

事前にありがとうございます

「いいね!」 1

一般的な問題については何も見つかりませんでしたが、以下のコードで問題を回避できました。

{{#each categories as |c|}}
    {{category-notifications-button
        ...
        onChange=(action (mut c.notification_level))
    }}
{{/each}}

つまり、ボタンから返された値でフィールド c.notification_level を変更したいと考えているようです。

実際、私の問題は上記の方法では解決できませんでした:

  • はい、通知レベルは変更されましたが…
  • 保存されませんでした。他の場所でクリックして別のアクションで保存する必要があります。

GitHub のコードデータベースでランダムなキーワードを徹底的に検索した結果、以下のような構造を見つけました:
{{d-button action=(action "up" wc) ...}}

いくつかのテストを行った結果、以下のように動作することがわかりました:

  • テンプレート:
    {{d-button action=(action "nameoftheaction" arg1 arg2) ...}}
    
  • JS:
    api.modifyClass("component:some-component", {
        actions: {
            nameoftheaction(arg1, arg2, argA, argB) {
                console.log(arg1);
                console.log(arg2);
                console.log(argA);
                console.log(argB);
            }
        }
    })
    

メソッドの最初の引数 arg1arg2 はテンプレートから渡されたものです。残りの引数 argAargB… はコンポーネントの特性によって提供される場合があります(例えば、category-notifications-button はユーザーがクリックした設定に応じて整数を返します)。

私が書いた内容が完全に正しいとは限りませんが、私と同じ質問をしている誰かの助けになれば幸いです。

「いいね!」 1