我有两个模型,一个带有许多消息
的用户
:
App.Router.map(function() {
this.resource('user', { path: ':user_id' }, function () {
this.route('profile', { path: 'profile' });
this.resource('messages');
});
});
App.User = DS.Model.extend({
displayName: DS.attr('string'),
email: DS.attr('string'),
firstName: DS.attr('string'),
lastName: DS.attr('string'),
location: DS.attr('string'),
messages: DS.hasMany('message')
});
App.Message = DS.Model.extend({
user: DS.belongsTo('user'),
createdAt: DS.attr('date'),
updatedAt: DS.attr('date'),
fullText: DS.attr('string'),
subject: DS.attr('string'),
recipients: DS.attr('string')
});
目前,当我搜索用户时,我必须加载整个模型,包括与用户关联的所有消息。
我想做的是:
- 检索用户
- 检索用户的消息(当选择用户时)
我在 Ember 中找不到简单的方法来做到这一点。我最好的猜测是在 route 调用 find
,可能:
App.UserRoute = Ember.Route.extend({
model: function (params) {
var user = this.store.find('user', params.user_id);
this.store.find('message', { user: 3 });
return user;
}
}
但这会生成 URL /messages?user_id=3
。我想要的是类似 /users/3/messages
的内容。
如何查询与用户关联的消息?
最佳答案
我认为 { async: true }
就是您正在寻找的。请参阅http://discuss.emberjs.com/t/what-is-an-async-relationship-async-true-vs-async-false/4107关于它是什么以及如何使用它的一些讨论。
您可能希望像这样设置模型:
App.User = DS.Model.extend({
displayName: DS.attr('string'),
email: DS.attr('string'),
firstName: DS.attr('string'),
lastName: DS.attr('string'),
location: DS.attr('string'),
messages: DS.hasMany('message', { async: true } )
});
然后,当您的 Handlebars 模板请求 {{myUser.messages}}
(或 {{myUser.messages.someProperty}}
)时,Ember 数据将查看User
模型,并注意消息 ID(例如 5、10 和 12)。然后它将在本地数据存储中查找消息 5、10 和 12。如果有,则它将显示它们。如果它们不存在,它将使用您为 Message
定义的适配器(或者如果没有定义适配器,则使用默认的 RESTAdapter
)来获取这些使用 HTTP GET。
我相信它会对每个 ID 发出一个请求(而不是对所有 ID 发出一个请求),但我对此并不能 100% 确定。
关于javascript - Ember JS : Fetch a Single Attribute of a Model After the Model is Fetched,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25222720/