Останнє оновлення назавжди : я не можу продовжувати оновлювати це. Тож це застаріло і, швидше за все, буде таким. ось кращий та сучасніший потік 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>
(див. скрипку )