EmberJS: Comment charger plusieurs modèles sur la même route?
Alors que je ne suis pas de nouvelles pour le développement web, je suis assez nouveau à côté client MVC cadres. J'ai fait quelques recherches et a décidé de lui donner un aller avec EmberJS. Je suis passé par la TodoMVC guide et il fait sens pour moi...
J'ai la configuration basique d'une application; l'indice de la route, deux modèles et un modèle. J'ai un script php côté serveur en cours d'exécution qui retourne quelques db lignes.
Une chose qui est très déroutant moi est de savoir comment charger plusieurs modèles sur la même route. J'ai lu quelques informations sur l'utilisation d'un setupController mais je suis pas encore clair. Dans mon modèle, j'ai deux tables que je suis en train de charger sans rapport avec db lignes. Dans une approche plus traditionnelle de web app, j'aurais juste émis pour des instructions sql et en boucle sur eux pour remplir les lignes. J'ai de la difficulté à traduire ce concept à EmberJS.
Comment puis-je charger plusieurs modèles de données non pertinentes, sur la même route?
Je suis en utilisant la dernière Braise et de Braise Données libs.
Mise à jour
bien que le premier donne une méthode pour la traiter, la deuxième réponse explique quand c'est approprié, et les différentes méthodes pour quand il n'est pas approprié.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le De braise.RSVP.de hachage charger plusieurs modèles:
app/routes/index.js
Et dans votre modèle, vous pouvez vous référer à
people
etcompanies
pour obtenir les données chargées:app/templates/index.js
C'est un Ornement avec cet exemple: https://ember-twiddle.com/c88ce3440ab6201b8d58
{{link-to 'index' someModel}}
, puis le modèle de crochet est complètement ignorée qui va casser cet exemple. Une approche plus solide est à la charge supplémentaire de modèles danssetupController
qui est toujours exécuter.ATTENTION:
Vous voulez être prudent quant à savoir si ou non le renvoi de plusieurs modèles dans votre modèle de crochet est approprié. Posez-vous cette simple question:
:id
? c'est à direthis.resource('foo', {path: ':id'});
Si vous avez répondu oui
Ne tentez pas de charger plusieurs modèles à partir du modèle de crochet dans cette voie!!! La raison réside dans la façon de Braise poignées en les reliant à des itinéraires. Si vous fournir un modèle pour créer un lien vers cette voie (
{{link-to 'foo' model}}
,transitionTo('foo', model)
), il va sauter le modèle de crochet et d'utiliser le modèle fourni. C'est sans doute problématique, puisque vous attend plusieurs modèles, mais un seul modèle à être livrés. Voici une alternative:Faire dans
setupController
/afterModel
Exemple: http://emberjs.jsbin.com/cibujahuju/1/edit
Si vous avez besoin de bloquer la transition (comme le modèle hook) de retour d'une promesse de l'
afterModel
crochet. Vous devrez assurer le suivi manuel des résultats de crochet et crochet de votre contrôleur.Exemple: http://emberjs.jsbin.com/diqotehomu/1/edit
Si vous avez répondu non
Aller de l'avant, revenons-en plusieurs modèles à partir de la route de modèle de crochet:
Exemple: http://emberjs.jsbin.com/tuvozuwa/1/edit
Si c'est quelque chose qui doit être attendu (comme un appel au serveur, une sorte de promesse)
Exemple: http://emberjs.jsbin.com/xucepamezu/1/edit
Dans le cas de Braise Données
Exemple: http://emberjs.jsbin.com/pekohijaku/1/edit
Si l'on est une promesse, et l'autre ne l'est pas, c'est du tout bon, RSVP fera un plaisir de l'utiliser de la valeur
Exemple: http://emberjs.jsbin.com/coxexubuwi/1/edit
Mélanger et assortir et amusez-vous!
Exemple: http://emberjs.jsbin.com/joraruxuca/1/edit
serialize:
crochet dans votre itinéraire) plutôt que de passer à un modèle dans le lien. Pour info la syntaxe pour accéder aux propriétés du modèle dans les modèles seraitmodel.model1.someProperty
oumodel.puppyModel.someOtherProperty
- Je utiliser quelque chose comme la réponse que Marcio fourni, mais il ressemble à quelque chose comme ceci:
then
fonctions ne fait aucune différence. Vous gâcher avec async code et les retours.Si vous utilisez de Braise de Données, c'est encore plus simple pour les sans rapport avec les modèles:
Si vous ne souhaitez récupérer une propriété de l'objet pour
model2
, utilisez DS.PromiseObject au lieu de DS.PromiseArray:La dernière version de JSON API mises en œuvre dans la Braise de Données v1.13 prend en charge le regroupement des différentes ressources dans la même demande très bien, si vous n'avez pas l'esprit de la modification de votre API points de terminaison.
Dans mon cas, j'ai un
session
point de terminaison. La session se rapporte à un utilisateur d'enregistrer et de l'enregistrement de l'utilisateur concerne les différents modèles que je veux toujours chargé à tout moment. C'est assez agréable pour tous à venir avec la demande.Une mise en garde par la spécification est que toutes les entités de retour doit être lié en quelque sorte à la primaire de l'entité en cours de réception. Je crois que ember-data ne traverse l'explicite les relations lors de la normalisation du JSON.
Pour d'autres cas, je suis maintenant de choisir de différer le chargement de modèles supplémentaires jusqu'à ce que la page est déjà chargé, c'est à dire de séparer les panneaux de données ou que ce soit, au moins, la page est rendue le plus rapidement possible. Faisant cela, il y a une certaine perte ou le changement de la "automatique" erreur de chargement de l'état d'être jugé.