Последнее обновление навсегда : я не могу продолжать обновлять это. Так что это устарело и, скорее всего, будет таким. вот лучшая и более современная ветка EmberJS: Как загрузить несколько моделей по одному и тому же маршруту?
Обновление: в моем первоначальном ответе я сказал использовать embedded: true
в определении модели. Это неверно. В версии 12 Ember-Data ожидает, что внешние ключи будут определены с суффиксом ( ссылкой ) _id
для отдельной записи или _ids
для коллекции. Что-то похожее на следующее:
{
id: 1,
title: 'string',
body: 'string string string string...',
author_id: 1,
comment_ids: [1, 2, 3, 6],
tag_ids: [3,4]
}
Я обновил скрипку и сделаю это снова, если что-то изменится или если я обнаружу больше проблем с кодом, приведенным в этом ответе.
Ответ со связанными моделями:
Для сценария вы описываете, я бы полагаться на ассоциации между моделями (настройки embedded: true
) и только загрузить Post
модель в этом маршруте, учитывая , что я могу определить DS.hasMany
ассоциацию для Comment
модели и DS.belongsTo
ассоциации для User
в обоих Comment
и Post
моделях. Что-то вроде этого:
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')
});
Это определение даст примерно следующее:
Благодаря этому определению, всякий раз, когда я find
пишу сообщение, я буду иметь доступ к коллекции комментариев, связанных с этим сообщением, а также к автору комментария и пользователю, который является автором сообщения, поскольку все они встроены . Маршрут остается простым:
App.PostsPostRoute = Em.Route.extend({
model: function(params) {
return App.Post.find(params.post_id);
}
});
Таким образом, в PostRoute
(или PostsPostRoute
если вы используете resource
) мои шаблоны будут иметь доступ к контроллеру content
, который является Post
моделью, поэтому я могу ссылаться на автора просто какauthor
<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>
(см. скрипку )
Ответ с не связанными моделями:
Однако, если ваш сценарий немного сложнее того, что вы описали, и / или вам необходимо использовать (или запрашивать) разные модели для определенного маршрута, я бы рекомендовал сделать это в Route#setupController
. Например:
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));
}
});
И теперь, когда я нахожусь на маршруте Post, мои шаблоны будут иметь доступ к user
свойству в контроллере, как это было настроено в setupController
хуке:
<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>
(см. скрипку )