EmberJS:在获取模型后获取模型的单个属性

EmberJS: Fetch a Single Attribute of a Model After the Model is Fetched

本文关键字:获取 模型 单个 属性 EmberJS      更新时间:2023-09-26

我有两个模型,一个User和许多Messages:

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')    
});

当前,当我执行用户搜索时,我必须加载整个模型,包括与用户关联的所有消息。

我想做的是:

  1. 检索用户
  2. 检索用户的消息(当用户被选中时)

我在烬中找不到一个简单的方法来做到这一点。我最好的猜测是呼叫路由中的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 Data将查看User模型,并注意消息id(例如,5,10和12)。然后,它将在本地数据存储中查找消息5、10和12。如果有,就会显示出来。如果它们不存在,那么它将使用您为Message定义的适配器(或者如果没有定义默认的RESTAdapter适配器)使用HTTP GET获取它们。

我相信它会对每个id发出一个请求(而不是对所有id发出一个请求),但这是我不能100%确定的事情。