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

时间:2014-08-09 20:27:13

标签: javascript ember.js datastore

我有两个模型,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. 检索用户的消息(选择用户时)
  3. 我无法在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;
      }
    }
    

    但这会生成网址/messages?user_id=3。我想要的是/users/3/messages

    如何查询与用户关联的消息?

1 个答案:

答案 0 :(得分:1)

我认为{ 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,然后,它将在本地数据存储区中查找消息5,10和12.如果有它们,它将显示它们。如果它们不存在,它将使用您为{定义的适配器{ {1}}(或者,如果没有定义适配器,则使用HTTP GET来获取默认值Message)。

我相信它会为每个id提出一个请求(而不是一个请求),但这是我不能100%肯定的。