Cập nhật lần cuối mãi mãi : Tôi không thể tiếp tục cập nhật cái này. Vì vậy, điều này không được dùng nữa và có thể sẽ là theo cách này. đây là một chủ đề hay hơn và cập nhật hơn EmberJS: Làm thế nào để tải nhiều mô hình trên cùng một tuyến đường?
Cập nhật: Trong câu trả lời ban đầu của tôi, tôi đã nói là sử dụng embedded: true
trong định nghĩa mô hình. Điều đó không chính xác. Trong bản sửa đổi 12, Ember-Data mong đợi các khóa ngoại được xác định bằng một hậu tố ( liên kết ) _id
cho một bản ghi hoặc _ids
cho bộ sưu tập. Một cái gì đó tương tự như sau:
{
id: 1,
title: 'string',
body: 'string string string string...',
author_id: 1,
comment_ids: [1, 2, 3, 6],
tag_ids: [3,4]
}
Tôi đã cập nhật fiddle và sẽ thực hiện lại nếu có bất kỳ điều gì thay đổi hoặc nếu tôi phát hiện thêm vấn đề với mã được cung cấp trong câu trả lời này.
Trả lời với các mô hình liên quan:
Đối với kịch bản bạn đang mô tả, tôi sẽ dựa vào các liên kết giữa các mô hình (cài đặt embedded: true
) và chỉ tải Post
mô hình trong tuyến đó, xem xét tôi có thể xác định một DS.hasMany
liên kết cho Comment
mô hình và DS.belongsTo
liên kết cho User
cả mô hình Comment
và Post
mô hình. Một cái gì đó như thế này:
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')
});
Định nghĩa này sẽ tạo ra một cái gì đó như sau:
Với định nghĩa này, bất cứ khi nào tôi find
là một Bài đăng, tôi sẽ có quyền truy cập vào một bộ sưu tập các nhận xét được liên kết với bài đăng đó và cả tác giả của nhận xét cũng như người dùng là tác giả của bài đăng, vì tất cả chúng đều được nhúng . Lộ trình vẫn đơn giản:
App.PostsPostRoute = Em.Route.extend({
model: function(params) {
return App.Post.find(params.post_id);
}
});
Vì vậy, trong PostRoute
(hoặc PostsPostRoute
nếu bạn đang sử dụng resource
), các mẫu của tôi sẽ có quyền truy cập vào bộ điều khiển content
, đó là Post
mô hình, vì vậy tôi có thể tham khảo tác giả, đơn giản là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>
(xem fiddle )
Trả lời với các mô hình không liên quan:
Tuy nhiên, nếu tình huống của bạn phức tạp hơn một chút so với những gì bạn đã mô tả và / hoặc phải sử dụng (hoặc truy vấn) các mô hình khác nhau cho một tuyến đường cụ thể, tôi khuyên bạn nên thực hiện nó Route#setupController
. Ví dụ:
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));
}
});
Và bây giờ khi tôi đang ở trong tuyến Post, các mẫu của tôi sẽ có quyền truy cập vào thuộc user
tính trong bộ điều khiển như nó đã được thiết lập trong 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>
(xem fiddle )