Ostatnia aktualizacja na zawsze : nie mogę tego aktualizować. Więc to jest przestarzałe i prawdopodobnie tak będzie. oto lepszy i bardziej aktualny wątek EmberJS: Jak załadować wiele modeli na tej samej trasie?
Aktualizacja: W mojej pierwotnej odpowiedzi powiedziałem, aby użyć embedded: truew definicji modelu. To jest niepoprawne. W wersji 12 Ember-Data oczekuje, że klucze obce będą definiowane z sufiksem ( łączem ) _iddla pojedynczego rekordu lub _idsdo kolekcji. Coś podobnego do następującego:
{
id: 1,
title: 'string',
body: 'string string string string...',
author_id: 1,
comment_ids: [1, 2, 3, 6],
tag_ids: [3,4]
}
Zaktualizowałem skrzypce i zrobię to ponownie, jeśli coś się zmieni lub jeśli znajdę więcej problemów z kodem podanym w tej odpowiedzi.
Odpowiedz za pomocą powiązanych modeli:
W przypadku scenariusza, który opisujesz, oparłbym się na powiązaniach między modelami (ustawieniami embedded: true) i załadowałbym Postmodel tylko w tej trasie, biorąc pod uwagę, że mogę zdefiniować DS.hasManyskojarzenie dla Commentmodelu i DS.belongsToskojarzenie dla Userobu modeli Commenti Post. Coś takiego:
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')
});
Ta definicja dałaby coś takiego:

Dzięki tej definicji za każdym razem, gdy piszę findpost, będę miał dostęp do zbioru komentarzy powiązanych z tym postem, a także autora komentarza oraz użytkownika, który jest autorem posta, ponieważ wszystkie są osadzone . Trasa pozostaje prosta:
App.PostsPostRoute = Em.Route.extend({
model: function(params) {
return App.Post.find(params.post_id);
}
});
Więc w PostRoute(lub PostsPostRoutejeśli używasz resource) moje szablony będą miały dostęp do kontrolera content, który jest Postmodelem, więc mogę odwołać się do autora, po prostu jakoauthor
<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>
(patrz skrzypce )
Odpowiedź z niepowiązanymi modelami:
Jeśli jednak Twój scenariusz jest nieco bardziej złożony niż ten, który opisałeś i / lub musisz używać (lub przeszukiwać) różne modele dla określonej trasy, polecam zrobić to w programie Route#setupController. Na przykład:
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));
}
});
A teraz, gdy jestem w trasie postu, moje szablony będą miały dostęp do userwłaściwości w kontrolerze, tak jak zostało ustawione w setupControllerhooku:
<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>
(patrz skrzypce )