2013-08-25 3 views
0

Je voudrais afficher une certaine paire contrôleur/vue plusieurs fois simultanément. Le problème est que l'itinéraire change le modèle sur le contrôleur actuel au lieu d'en créer un nouveau.Force route vers instantiante nouveau contrôleur/vue paire au lieu de changer de modèle

Est-il possible de forcer une route à instancier un nouveau contrôleur? J'ai essayé de jouer avec les callbacks et les hooks dans Ember.Route mais je ne trouve aucun moyen de le faire se comporter comme ça.

+0

à quoi ressemble votre modèle? Etes-vous également conscient de l'existence de l'option 'itemController' pour un assistant' {{#each}} 'ou un' ArrayController'? – intuitivepixel

+0

Je suis simplement en train d'essayer un prototype afin que je puisse toujours façonner le modèle comme je le souhaite. J'ai commencé avec un violon (http://jsfiddle.net/6WV2U/1/) mais je suis resté bloqué sur ce problème. – Rengers

Répondre

1

Si vous souhaitez afficher plusieurs modèles simultanément, il semble que le point de routage vers un seul modèle qui change ne correspond pas bien à ce que vous essayez de faire. Le routeur n'a pas été conçu pour ajouter des vues supplémentaires à un affichage sauf si vous utilisez des routes imbriquées. Vous pouvez essayer de remplacer le renderTemplate hook de votre itinéraire et utiliser render() pour spécifier le contrôleur utilisé, mais cela ne vous aide pas lorsque plusieurs paires contrôleur/vue sont affichées simultanément. Au lieu de cela, j'essaierais d'utiliser l'une des façons de spécifier un contrôleur personnalisé. Lorsque vous avez une collection de choses à afficher, la manière la plus simple est avec le #each helper dans votre modèle.

{{#each product in products itemController='myControllerName'}} 

Si vous souhaitez spécifier une classe de vue personnalisée, vous pouvez également le faire.

{{#each product in products itemController='myControllerName' itemViewClass='App.MyView'}} 

Selon ce que vous essayez de faire, une approche alternative pour obtenir un contexte qui obtient une nouvelle instance à chaque fois est en créant un composant . C'est plus lourd, cependant, et vous devrez probablement refactoriser une partie de votre code, en déplaçant la logique du contrôleur dans le composant.

+0

Merci. Je pensais que le routeur n'était pas conçu pour cela. L'utilisation de chaque ou des composants pourrait être le chemin à parcourir alors. Je voudrais cependant que l'URL pointe vers le dernier modèle affiché. Fondamentalement, ce que j'essaie de créer est une interface où une nouvelle vue d'itinéraire «glisse» partiellement sur la vue précédente. Comme dans le lecteur Web Spotify: http://i.stack.imgur.com/5FaWt.jpg s'anime dans http://i.stack.imgur.com/YDnU9.jpg. Je suppose que j'ai besoin de mettre à jour l'URL manuellement, mais cela serait-il possible avec le routeur? – Rengers

+1

Je n'utilise pas spotify, donc je ne peux pas dire avec certitude, mais à partir de vos captures d'écran, il semble que vous pourriez utiliser le paramètre '# each '+' itemController' ci-dessus pour obtenir votre première capture d'écran pour afficher tous les artistes. Mais ajoutez ensuite un itinéraire imbriqué avec un segment dynamique contenant l'ID de l'artiste sur lequel vous avez zoomé pour obtenir les détails de votre deuxième capture d'écran. Lorsque vous cliquez sur un artiste dans la liste, passez à cette nouvelle route. Vous pouvez utiliser un observateur sur le modèle sélectionné pour effectuer votre transition d'interface utilisateur et, si cela a du sens, un {{{outlet}}} avec un modèle imbriqué. –

+0

Cela fonctionnerait pour une page d'aperçu + page de détails de l'artiste. Mais à partir de cette page 'artiste', vous pouvez cliquer sur d'autres pages 'artiste'. Ceux-ci seraient ensuite superposés les uns sur les autres. Les URL sont juste /: artist_id, sans aucune imbrication. Le problème est quand je veux passer à un autre artiste, il ne crée pas de nouveau contrôleur que je peux superposer, mais change juste l'artiste sur le contrôleur d'artiste le plus haut. Peut-être que je devrais juste renoncer au routeur pour cela, mais un utilisateur devrait toujours être capable d'aller à une page en utilisant l'URL /: artist_id, seulement alors il ne montre aucune superposition. – Rengers

Questions connexes