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 ( enlace ) _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 fiddle et je le referai si quelque chose change ou si je trouve d'autres problèmes avec le code fourni dans cette réponse.
Réponse avec des modèles connexes :
Pour le scénario que vous décrivez, je m'appuierais sur associations entre les modèles (réglage embedded: true
) et ne charger que le Post
dans cette voie, en considérant que je peux définir une DS.hasMany
association pour le Comment
et DS.belongsTo
association pour le User
dans les deux Comment
y 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 je find
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, puisqu'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);
}
});
Ainsi, dans le PostRoute
(ou PostsPostRoute
si vous utilisez resource
), mes modèles auront accès à l'interface du contrôleur. content
qui est le Post
modèle, afin que je puisse me référer à l'auteur, simplement en tant que author
<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 sans rapport :
Cependant, si votre scénario est un peu plus complexe que ce que vous avez décrit, et/ou ont pour utiliser (ou interroger) différents modèles pour un itinéraire particulier, je recommande de le faire en Route#setupController
. Par exemple :
App.PostsPostRoute = Em.Route.extend({
model: function(params) {
return App.Post.find(params.post_id);
},
// in this sample, "model" is an instance of "Post"
// coming from the model hook above
setupController: function(controller, model) {
controller.set('content', model);
// the "user_id" parameter can come from a global variable for example
// or you can implement in another way. This is generally where you
// setup your controller properties and models, or even other models
// that can be used in your route's template
controller.set('user', App.User.find(window.user_id));
}
});
Et maintenant, lorsque je suis dans la route de la poste, mes modèles auront accès à l'interface de l'utilisateur. user
dans le contrôleur tel qu'il a été mis en place dans setupController
crochet :
<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 )