2

嘿,我需要修改一些从 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 请求。

更新: 我设法为这个问题创建了一个解决方法。在我的控制器中,我创建了一个新属性来侦听 model.@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')
});
4

3 回答 3

5

余烬数据 1.13

所以在这个话题上花了一些时间后,我找到了解决这个问题的方法。这基本上就是 ember 的工作方式。所以在后台 findAll 正在返回两个承诺。

findAll 在存储中没有数据

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

findAll 与商店中的数据

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

如果您想等待所有数据被加载,您可以使用只返回一个承诺的查询。

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

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

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

你可以看看github上的以下讨论

余烬数据 2.0

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

于 2015-10-11T11:28:00.227 回答
1

首先,您应该确保数据按预期从 Mirage 传入。打开您的 Ember 检查器并验证进入您商店的模型。如果没有,您的模拟路由的 JSON 响应格式可能存在问题。

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

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

this.get('/contacts', function(db, request) {
  return {
    data: db.contacts.map(attrs => {
      type: 'contacts',
      id: attrs.id,
      attributes: attrs
    })
  };
});
于 2015-07-29T12:37:43.037 回答
0

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

于 2015-10-11T23:37:17.970 回答