Ultimo aggiornamento per sempre : non posso continuare ad aggiornare questo. Quindi questo è deprecato e probabilmente sarà in questo modo. ecco un thread migliore e più aggiornato EmberJS: come caricare più modelli sullo stesso percorso?
Aggiornamento: nella mia risposta originale ho detto di utilizzare embedded: true
nella definizione del modello. Non è corretto. Nella revisione 12, Ember-Data prevede che le chiavi esterne siano definite con un suffisso ( collegamento ) _id
per un singolo record o _ids
per la raccolta. Qualcosa di simile al seguente:
{
id: 1,
title: 'string',
body: 'string string string string...',
author_id: 1,
comment_ids: [1, 2, 3, 6],
tag_ids: [3,4]
}
Ho aggiornato il violino e lo farò di nuovo se qualcosa cambia o se trovo più problemi con il codice fornito in questa risposta.
Rispondi con i modelli correlati:
Per lo scenario che si sta descrivendo, vorrei contare su associazioni tra i modelli (impostazione embedded: true
) e caricare solo il Post
modello quell'itinerario, considerando posso definire DS.hasMany
un'associazione per la Comment
modella e DS.belongsTo
associazione per la User
sia nella Comment
ePost
modelli. Qualcosa come questo:
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')
});
Questa definizione produrrebbe qualcosa di simile al seguente:
Con questa definizione, ogni volta che creo find
un post, avrò accesso a una raccolta di commenti associati a quel post, nonché all'autore del commento e all'utente che è l'autore del post, poiché sono tutti incorporati . Il percorso rimane semplice:
App.PostsPostRoute = Em.Route.extend({
model: function(params) {
return App.Post.find(params.post_id);
}
});
Quindi in PostRoute
(o PostsPostRoute
se stai usando resource
), i miei modelli avranno accesso a quello del controller content
, che è il Post
modello, quindi posso fare riferimento all'autore, semplicemente comeauthor
<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>
(vedi violino )
Rispondi con modelli non correlati:
Tuttavia, se lo scenario è un po 'più complessa di quello che hai descritto, e / o hanno da usare (o query) diversi modelli per una linea particolare, vi consiglio di farlo in Route#setupController
. Per esempio:
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 ora quando sono nel percorso Post, i miei modelli avranno accesso alla user
proprietà nel controller così come è stato impostato in 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>
(vedi violino )