Última atualização para sempre : não posso continuar atualizando isso. Portanto, ele está obsoleto e provavelmente será assim. aqui está um tópico melhor e mais atualizado EmberJS: Como carregar vários modelos na mesma rota?
Update: Na minha resposta original eu disse para usar embedded: true
na definição do modelo. Isso está incorreto. Na revisão 12, Ember-Data espera que as chaves estrangeiras sejam definidas com um sufixo ( link ) _id
para registro único ou _ids
para coleta. Algo semelhante ao seguinte:
{
id: 1,
title: 'string',
body: 'string string string string...',
author_id: 1,
comment_ids: [1, 2, 3, 6],
tag_ids: [3,4]
}
Eu atualizei o violino e o farei novamente se algo mudar ou se eu encontrar mais problemas com o código fornecido nesta resposta.
Responda com modelos relacionados:
Para o cenário que você está descrevendo, eu confiaria em associações entre modelos (configuração embedded: true
) e apenas carregaria o Post
modelo nessa rota, considerando que posso definir uma DS.hasMany
associação para o Comment
modelo e uma DS.belongsTo
associação para User
nos modelos Comment
e Post
. Algo assim:
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')
});
Essa definição produziria algo como o seguinte:
Com essa definição, sempre que eu find
postar, terei acesso a uma coleção de comentários associados a essa postagem, bem como ao autor do comentário e ao usuário que é o autor da postagem, uma vez que estão todos incorporados . A rota permanece simples:
App.PostsPostRoute = Em.Route.extend({
model: function(params) {
return App.Post.find(params.post_id);
}
});
Portanto, no PostRoute
(ou PostsPostRoute
se você estiver usando resource
), meus modelos terão acesso ao controlador content
, que é o Post
modelo, então posso me referir ao autor, simplesmente comoauthor
<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>
(ver violino )
Responder com modelos não relacionados:
No entanto, se o seu cenário for um pouco mais complexo do que o que você descreveu e / ou tiver que usar (ou consultar) modelos diferentes para uma rota específica, recomendo fazê-lo em Route#setupController
. Por exemplo:
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));
}
});
E agora, quando estou na rota Post, meus modelos terão acesso à user
propriedade no controlador conforme foi configurado no setupController
gancho:
<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>
(ver violino )