Dernière mise à jour pour toujours : je ne peux pas continuer à mettre à jour ceci. C'est donc obsolète et ce sera probablement le cas. voici un fil de discussion meilleur et plus à jour EmberJS: Comment charger plusieurs modèles sur le même itinéraire?
Mise à jour: Dans ma réponse initiale, j'ai dit d'utiliser embedded: true
dans la définition du modèle. C'est incorrect. Dans la révision 12, Ember-Data s'attend à ce que les clés étrangères soient définies avec un suffixe ( lien ) _id
pour un seul enregistrement ou _ids
pour la collecte. Quelque chose de similaire à ce qui suit:
{
id: 1,
title: 'string',
body: 'string string string string...',
author_id: 1,
comment_ids: [1, 2, 3, 6],
tag_ids: [3,4]
}
J'ai mis à jour le violon et je le ferai à nouveau si quelque chose change ou si je trouve plus de problèmes avec le code fourni dans cette réponse.
Réponse avec des modèles associés:
Pour le scénario que vous décrivez, je compter sur les associations entre les modèles (réglage embedded: true
) et seulement charger le Post
modèle dans cette voie, étant donné que je peux définir une DS.hasMany
association pour le Comment
modèle et l' DS.belongsTo
association pour le User
dans les deux Comment
et Post
modèles. Quelque chose comme ça:
App.User = DS.Model.extend({
firstName: DS.attr('string'),
lastName: DS.attr('string'),
email: DS.attr('string'),
posts: DS.hasMany('App.Post'),
comments: DS.hasMany('App.Comment')
});
App.Post = DS.Model.extend({
title: DS.attr('string'),
body: DS.attr('string'),
author: DS.belongsTo('App.User'),
comments: DS.hasMany('App.Comment')
});
App.Comment = DS.Model.extend({
body: DS.attr('string'),
post: DS.belongsTo('App.Post'),
author: DS.belongsTo('App.User')
});
Cette définition produirait quelque chose comme ce qui suit:
Avec cette définition, chaque fois que find
je publierai un message, j'aurai accès à une collection de commentaires associés à ce message, ainsi qu'à l'auteur du commentaire et à l'utilisateur qui est l'auteur du message, car ils sont tous intégrés . L'itinéraire reste simple:
App.PostsPostRoute = Em.Route.extend({
model: function(params) {
return App.Post.find(params.post_id);
}
});
Donc, dans le PostRoute
(ou PostsPostRoute
si vous utilisez resource
), mes modèles auront accès au contrôleur content
, qui est le Post
modèle, afin que je puisse me référer à l'auteur, simplement commeauthor
<script type="text/x-handlebars" data-template-name="posts/post">
<h3>{{title}}</h3>
<div>by {{author.fullName}}</div><hr />
<div>
{{body}}
</div>
{{partial comments}}
</script>
<script type="text/x-handlebars" data-template-name="_comments">
<h5>Comments</h5>
{{#each content.comments}}
<hr />
<span>
{{this.body}}<br />
<small>by {{this.author.fullName}}</small>
</span>
{{/each}}
</script>
(voir violon )
Réponse avec des modèles non liés:
Cependant, si votre scénario est un peu plus complexe que ce que vous avez décrit et / ou si vous devez utiliser (ou interroger) différents modèles pour un itinéraire particulier, je vous recommande de le faire dans Route#setupController
. Par exemple:
App.PostsPostRoute = Em.Route.extend({
model: function(params) {
return App.Post.find(params.post_id);
},
setupController: function(controller, model) {
controller.set('content', model);
controller.set('user', App.User.find(window.user_id));
}
});
Et maintenant, lorsque je suis dans la route Post, mes modèles auront accès à la user
propriété dans le contrôleur tel qu'il a été configuré dans setupController
hook:
<script type="text/x-handlebars" data-template-name="posts/post">
<h3>{{title}}</h3>
<div>by {{controller.user.fullName}}</div><hr />
<div>
{{body}}
</div>
{{partial comments}}
</script>
<script type="text/x-handlebars" data-template-name="_comments">
<h5>Comments</h5>
{{#each content.comments}}
<hr />
<span>
{{this.body}}<br />
<small>by {{this.author.fullName}}</small>
</span>
{{/each}}
</script>
(voir violon )