Ember Data findQuery不会更新关系

时间:2014-05-19 14:04:38

标签: ember.js ember-data

我正在更新到最新的ED,并且在大多数迁移中都取得了成功但是我的应用程序的一部分已经破坏了它在0.14上工作的地方。以下是我的方案示例:

App.User = DS.Model.extend({
  name: DS.attr(),
  times: DS.hasMany('time')
});

App.Time = DS.Model.extend({
  start: DS.attr(),
  end: DS.attr(),
  user: DS.belongsTo('user')
});

我在第一次提取时与用户一起传递一个数组(在初始加载和侧载时让我们说user.get('times.length'); // 20),然后当我滚动日历时,我执行findQuery多次: / p>

this.store.find('time', {
  start: '...',
  end: '...',
  user_id: 'x'
});

我现在按预期在商店中加载了新加载的time条记录,包含有效的开头和结尾以及正确的user belongsTo关系。

this.store.all('time').filterBy('user', user).get('length'); // 40

人们期望(以及0.14中发生的事情)是在该用户的相关时间列表中找到新加载的时间,但我得到的是:

user.get('times.length'); // 20 (still)

我正在使用ActiveModelAdapter。难道我做错了什么?也许这是预期的,我错过了备忘录?我将在未来几天起草一个jsbin,除非有人在此期间有一个简单的答案。

DEBUG: Ember      : 1.5.0
DEBUG: Ember Data : 1.0.0-beta.8+canary.db4febb4
DEBUG: Handlebars : 1.3.0
DEBUG: jQuery     : 1.10.0

2 个答案:

答案 0 :(得分:0)

我没有依赖user.times关系进行更新,而是在商店中发现了filter方法。

http://emberjs.com/api/data/classes/DS.Store.html#method_filter

在我需要时间的控制器中,我用以下内容初始化控制器:

init: function() {
  var _this = this;
  this._super();
  this.store.filter(App.Time, function(time) {
    user.get('user.id') === _this.get('user.id');
  }).then(function(records) {
    // A bound RecordArray is returned, which we can set to a property of this
    // controller and we can trust that it will be updated when the result of the
    // filter changes
    _this.set('times', records);
  });
}

瞧,我们可以在控制器上的times属性上构建计算属性,并期望在新时间加载到商店时更新它们。

答案 1 :(得分:0)

我遇到与findQuery类似的问题,并使用ajax手动设置查询,然后将结果传递给pushPayload,这会加载关系。

这是在我的路线档案中:

model: function(params) {
    const name = params.name;

    return ajax({
      method: 'GET',
      url: '/api/students',
      data: {'name': name},
      contentType: 'application/json',
      dataType: 'json'
    }).then(res => {
      this.store.pushPayload('student', res);
      return this.store.findAll('student', {'name': name});
    }).then(students => {
      return students.filterBy('name', name)[0];
    });
  },