Ember DS.Store.findAll()返回空集合

web*_*aya 1 ember.js ember-data ember-cli-mirage

嘿,我需要修改一些从DataStore获取的记录.如果我在路由器中添加以下代码,我可以看到请求传递给我的模板,但我无法修改集合的每个请求,因为集合是空的.

model() {
  return this.store.findAll('user').then(function(users) {
    console.log(users.get('length')); // 0
    return users;
  });
}
Run Code Online (Sandbox Code Playgroud)

我认为当从服务器获取所有记录时,promise会得到解决,但事实并非如此.或者我完全错过了什么.

我还尝试使用相同的结果修改afterModel回调中的模型.

我正在使用Ember 1.13.0(使用Ember-CLI),Ember-Data 1.13.4和ember-cli-mirage来模拟我的HTTP请求.

更新: 我设法为此问题创建了一个解决方法.在我的控制器中,我创建了一个新属性,它监听模型.@ each然后我能够修改模型并将其传递给视图.

export default Ember.Controller.extend({
  users: function() {
    return this.get('model.users').filter(function(user) {
      // The Promise is resolved twice
      // The first time with an empty model and the second time with 
      // the actual data. So I filter the empty model. 
      return user.get('id');
    }).map(function(user) {
      // do fancy stuff with our user
      return user
    });
  }.property('model.@each')
});
Run Code Online (Sandbox Code Playgroud)

web*_*aya 5

Ember数据1.13

因此,在花了一些时间在这个主题后,我找到了解决这个问题的方法.它基本上就是ember的工作方式.因此,在引擎盖下,findAll将返回两个承诺.

findAll没有商店中的数据

  • 从商店中查找记录(解析第一个承诺 - >长度0,因为商店中没有数据)
  • 在后台获取新数据(解决第二个承诺)

findAll与商店中的数据

  • 从商店查找记录(使用缓存数据解析第一个承诺)
  • 在后台获取新数据(使用新数据解析第二个承诺)

如果要等待加载所有数据,可以使用仅返回一个promise的查询.

model() {
  return this.store.query('user', {});
}
Run Code Online (Sandbox Code Playgroud)

对于findRecord,我发现了以下解决方法,只有在您的后端支持对记录的ID进行任何类型的过滤时才会有效.

model() {
  return this.store.query('user', {
    'filter[id]': 1
  }).then((users) => {
    return users.objectAt(0);
  });
}
Run Code Online (Sandbox Code Playgroud)

您可以在github上查看以下讨论

Ember Data 2.0

在Ember Data 2.0上,此问题已得到解决.