Les paramètres peuvent-ils être injectés depuis le modèle vers une action de widget ?

Suite à la discussion de Guide du développeur pour les thèmes Discourse :

Bonjour à tous,

Je me demandais s’il était possible d’injecter des paramètres depuis un modèle vers une action, mais je n’ai trouvé aucune réponse affirmative ou négative dans le guide de @Johani. Mon objectif est de générer plusieurs widgets depuis le modèle, et que l’action de chacun connaisse le paramètre de la boucle {{#each}}.

Voici un exemple, après avoir sélectionné le bouton multichoice des notifications de catégorie :

<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" ***injection_de_c_en_paramètre_d'une_manière_ou_d'une_autre***)
    }}
{{/each}}
</script>
<script type="text/discourse-plugin" version="0.8">
  api.modifyClass("controller:some_component", {
    actions: {
      changeCategoryNotificationLevel(selected_value, ***c_en_paramètre***) {
        c_en_paramètre.setNotification(notificationLevel);
      }
    }
  }
});
</script>

Existe-t-il un moyen, à l’intérieur de changeCategoryNotificationLevel, de savoir dans quelle catégorie on se trouve depuis le modèle ?

Si non, et si mon problème est bien décrit, quelqu’un voit-il une autre façon d’obtenir le même résultat ?

Merci d’avance

Je n’ai rien trouvé concernant le problème général, mais j’ai pu contourner le mien avec :

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

Ce qui signifie, je suppose, que je veux modifier le champ c.notification_level avec la valeur renvoyée par le bouton.

En fait, mon problème ne pouvait pas être résolu de la manière présentée ci-dessus :

  • oui, le niveau de notification a bien été modifié, mais…
  • il n’a pas été enregistré. Il fallait cliquer ailleurs pour l’enregistrer avec une autre action.

En recherchant intensivement des mots-clés aléatoires dans la base de code de GitHub, j’ai pu trouver une structure comme celle-ci :
{{d-button action=(action "up" wc) ...}}.

Après quelques tests, j’en suis arrivé à la conclusion que cela fonctionne ainsi :

  • modèle :
    {{d-button action=(action "nomdelaction" arg1 arg2) ...}}`.
    
  • JS :
    api.modifyClass("composant:some-component", {
        actions: {
            nomdelaction(arg1, arg2, argA, argB) {
                console.log(arg1);
                console.log(arg2);
                console.log(argA);
                console.log(argB);
            }
        }
    })
    

Les premiers arguments arg1, arg2 des méthodes sont ceux fournis par le modèle. Les arguments restants argA, argB… peuvent être fournis par la spécificité du composant (par exemple, le bouton category-notifications-button renverra un entier en fonction du paramètre sur lequel l’utilisateur clique).

Je ne suis absolument pas certain que ce que j’écris soit correct, mais cela pourrait aider quelqu’un qui se pose la même question que moi.