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

时间:2015-07-29 08:00:04

标签: 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;
  });
}

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

我还尝试使用相同的结果修改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')
});

3 个答案:

答案 0 :(得分:5)

Ember Data 1.13

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

findAll没有商店中的数据

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

在商店中查找所有数据

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

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

$ bash chext.sh txt html

$ ls -1
chext.sh
file1.html
file2.html
file3.html
file4.html
file5.html

对于findRecord,我找到了以下解决方法,该方法仅在您的后端支持对记录的ID进行任何类型的过滤时才有效。

model() {
  return this.store.query('user', {});
}

您可以在github

上查看以下讨论

Ember Data 2.0

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

答案 1 :(得分:1)

首先,您应该确保数据是按照您的预期从Mirage进来的。打开您的灰烬检查员并验证模型是否已进入您的商店。如果没有,您可能会遇到来自模拟路径的JSON响应格式的问题。

要进行诊断,请检查控制台以获取JSON响应的日志,并确保其符合您的预期。如果您的/mirage/config.js中有一条自定义路由处理程序用于此路由,您还可以在其中放置debugger语句并验证数据是否符合您的预期。

如果您使用的是默认的Ember Data 1.13,则可能意味着您正在使用JSON API序列化程序/适配器。这是你想要的吗?这个应用程序的后端最终会是什么样子?如果它将成为JSON API,那么您现在需要在Mirage config.js文件中做更多的工作,例如

this.get('/contacts', function(db, request) {
  return {
    data: db.contacts.map(attrs => {
      type: 'contacts',
      id: attrs.id,
      attributes: attrs
    })
  };
});

答案 2 :(得分:0)

使用Ember和Ember数据版本1.13时,我遇到的问题与您描述的问题类似。那时,我正在阅读没有Ember Data 2.0的Ember 2.0的更新文档。一旦我升级了两个库,我就能够获得您尝试使用第一个代码片段实现的行为。也就是说,使用ember数据2.0的非零记录正确处理了promise。