我有两个模型,一个有很多UserMessages

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中找不到简单的方法可以做到这一点。我最好的猜测是在路由中致电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 - EmberJS:提取模型后,获取模型的单个属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25222720/

10-14 22:45
查看更多