Scénario : Un widget d'autocomplétion avec son propre contrôleur et sa propre vue, de sorte qu'il s'agit d'un composant modulaire qui peut être rendu dans n'importe quelle autre vue avec {{render "autocomplete"}} ou éventuellement la nouvelle aide {{control}} une fois qu'il sera sorti de la phase expérimentale. Afin de rendre l'autocomplétion indépendante de tout le reste, elle ne doit pas être consciente du contrôleur parent ou de l'action qui se produit lorsqu'un élément est sélectionné.
J'ai essayé de comprendre comment utiliser le mixin Ember.Evented afin de pouvoir déclencher un événement à partir de l'autocomplétion, tel que itemSelected, qui peut ensuite remonter et être pris en compte par la vue ou le contrôleur parent.
Comme toujours, la documentation sur Ember est lacunaire. Surtout quand il s'agit d'Ember.Evented. (Pour être honnête, la documentation a beaucoup évolué, mais j'en veux toujours plus. On dit que la convention est préférable à la configuration sans fournir de conventions). Quoi qu'il en soit, assez de se plaindre, la documentation montre qu'Ember Evented fonctionne sur des objets génériques et j'ai trouvé ce post qui va un peu plus en profondeur : EmberJs prend-il en charge les événements de type "publish/subscriber" ? mais je pense qu'un exemple plus concret avec des contrôleurs, des vues, des routes et des composants comme les autocomplétions serait parfait.
Je pensais que ces types d'événements étaient censés relever de la responsabilité des vues, mais cela n'a pas fonctionné, alors j'ai mis le mixin sur les contrôleurs également. Cela prendra tout son sens lorsque vous verrez la jsFiddle
Vous y verrez un faux contrôleur d'autocomplétion qui récupère un ensemble statique de contenu à partir d'une fixation et affiche deux boutons pour chaque élément sur lesquels vous pouvez cliquer pour déclencher un événement à partir de la vue ou du contrôleur. Dans un exemple réel, la saisie dans la zone de texte serait observée et le contenu serait mis à jour pour présenter différentes suggestions en fonction de la saisie, mais ce n'est pas important pour cet exemple.
jsFiddle : http://jsfiddle.net/wCfb9/ Ce sont ces lignes qui m'inspirent le plus de méfiance : this.on("myEvent", this.addItem);
puisque la fonction qui déclenche l'événement est clairement appelée, mais c'est comme si l'événement ne se propageait pas ou que le contrôleur d'index et la vue n'étaient pas correctement configurés pour répondre à l'événement.
Voici les principales questions :
-
Que dois-je modifier pour que le contrôleur d'index puisse répondre à un événement déclenché par l'autocomplétion ?
-
Quel est le moyen le plus approprié pour y parvenir ? Le déclenchement et la réception doivent-ils se faire au niveau de la vue ou du contrôleur ?
-
Existe-t-il une meilleure façon de procéder ?
Note complémentaire : Ma solution actuelle est d'ajouter un needs: ["index"]
dans le contrôleur d'autocomplétion et au lieu de déclencher des événements, j'appelle explicitement la méthode dans le contrôleur d'index à partir du contrôleur d'autocomplétion. Cela pose de nombreux problèmes, tout d'abord un couplage étroit entre les contrôleurs, et ne s'adapte pas bien si l'autocomplétion est supposée affecter plusieurs contrôleurs ou être réutilisée ailleurs et doit être reconfigurée, etc.
J'espère avoir été suffisamment clair. Toute aide est appréciée.