Última actualización para siempre : no puedo seguir actualizando esto. Así que esto está desaprobado y probablemente será así. aquí hay un hilo mejor y más actualizado EmberJS: ¿Cómo cargar varios modelos en la misma ruta?
Actualización: en mi respuesta original dije que se usara embedded: true
en la definición del modelo. Eso es incorrecto. En la revisión 12, Ember-Data espera que las claves externas se definan con un sufijo ( enlace ) _id
para un solo registro o _ids
para una colección. Algo similar a lo siguiente:
{
id: 1,
title: 'string',
body: 'string string string string...',
author_id: 1,
comment_ids: [1, 2, 3, 6],
tag_ids: [3,4]
}
He actualizado el violín y lo volveré a hacer si algo cambia o si encuentro más problemas con el código proporcionado en esta respuesta.
Responda con modelos relacionados:
Para el escenario que está describiendo, me gustaría confiar en las asociaciones entre los modelos (de ajuste embedded: true
) y sólo cargar el Post
modelo en esa ruta, teniendo en cuenta que puede definir una DS.hasMany
asociación para el Comment
modelo y DS.belongsTo
la asociación para el User
tanto en el Comment
y Post
modelos. Algo como esto:
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')
});
Esta definición produciría algo como lo siguiente:
Con esta definición, cada vez que find
haga una publicación, tendré acceso a una colección de comentarios asociados con esa publicación, y también al autor del comentario, y al usuario que es el autor de la publicación, ya que todos están incrustados . La ruta sigue siendo simple:
App.PostsPostRoute = Em.Route.extend({
model: function(params) {
return App.Post.find(params.post_id);
}
});
Entonces, en PostRoute
(o PostsPostRoute
si está usando resource
), mis plantillas tendrán acceso al controlador content
, que es el Post
modelo, por lo que puedo referirme al autor, simplemente 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 violín )
Responda con modelos no relacionados:
Sin embargo, si su escenario es un poco más complejo de lo que describió y / o tiene que usar (o consultar) diferentes modelos para una ruta en particular, le recomendaría hacerlo en Route#setupController
. Por ejemplo:
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));
}
});
Y ahora, cuando estoy en la ruta de publicación, mis plantillas tendrán acceso a la user
propiedad en el controlador tal como se configuró en el 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 violín )