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: true
w definicji modelu. To jest niepoprawne. W wersji 12 Ember-Data oczekuje, że klucze obce będą definiowane z sufiksem ( łączem ) _id
dla pojedynczego rekordu lub _ids
do 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 Post
model tylko w tej trasie, biorąc pod uwagę, że mogę zdefiniować DS.hasMany
skojarzenie dla Comment
modelu i DS.belongsTo
skojarzenie dla User
obu modeli Comment
i 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ę find
post, 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 PostsPostRoute
jeśli używasz resource
) moje szablony będą miały dostęp do kontrolera content
, który jest Post
modelem, 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 user
właściwości w kontrolerze, tak jak zostało ustawione w setupController
hooku:
<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 )