Ember DS.Store.findAll() returns 空集合
Ember DS.Store.findAll() returns empty collection
嘿,我需要修改一些从 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')
});
首先,您应该确保数据是按照您的预期从 Mirage 传入的。打开您的 Ember 检查器并验证模型是否已进入您的商店。如果不是,您的模拟路由的 JSON 响应格式可能有问题。
要进行诊断,请查看您的控制台以获取 JSON 响应的日志,并确保它符合您的预期。如果您在 /mirage/config.js
中为此路由设置了自定义路由处理程序,您还可以在其中放置一个 debugger
语句并验证数据是否符合您的预期。
如果您使用的是默认 Ember Data 1.13,则可能意味着您使用的是 JSON API serializer/adapter。这是你想要的吗?这个应用程序的后端最终会是什么样子?如果它将成为 JSON API,您现在需要在 Mirage config.js
文件中做更多的工作,例如
this.get('/contacts', function(db, request) {
return {
data: db.contacts.map(attrs => {
type: 'contacts',
id: attrs.id,
attributes: attrs
})
};
});
Ember数据1.13
所以在这个主题上花了一些时间后,我找到了解决这个问题的方法。这基本上就是 ember 的工作方式。所以在引擎盖下 findAll 正在返回两个承诺。
findAll 存储中没有数据
- 从商店中查找记录(解决第一个承诺 -> 长度为 0,
因为存储中没有数据)
- 在后台获取新数据(解决第二个承诺)
在商店中查找所有数据
- 从存储中查找记录(使用缓存数据解决第一个承诺)
- 在后台获取新数据(用新的解决第二个承诺
数据)
如果您想等待所有数据加载完成,您可以使用只返回一个承诺的查询。
model() {
return this.store.query('user', {});
}
对于 findRecord,我找到了以下解决方法,只有当您的后端支持对您的记录 ID 进行任何类型的过滤时,该方法才有效。
model() {
return this.store.query('user', {
'filter[id]': 1
}).then((users) => {
return users.objectAt(0);
});
}
你可以看看github
下面的讨论
Ember数据2.0
在 Ember Data 2.0 上,此问题已解决。
我在使用 Ember 和 Ember 数据版本 1.13 时遇到了与您描述的问题类似的问题。当时,我正在阅读没有 Ember Data 2.0 的 Ember 2.0 的更新文档。一旦我升级了这两个库,我就能够得到你试图用第一个代码片段实现的行为。也就是说,使用 ember 数据 2.0.
的非零记录可以正确处理承诺
嘿,我需要修改一些从 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')
});
首先,您应该确保数据是按照您的预期从 Mirage 传入的。打开您的 Ember 检查器并验证模型是否已进入您的商店。如果不是,您的模拟路由的 JSON 响应格式可能有问题。
要进行诊断,请查看您的控制台以获取 JSON 响应的日志,并确保它符合您的预期。如果您在 /mirage/config.js
中为此路由设置了自定义路由处理程序,您还可以在其中放置一个 debugger
语句并验证数据是否符合您的预期。
如果您使用的是默认 Ember Data 1.13,则可能意味着您使用的是 JSON API serializer/adapter。这是你想要的吗?这个应用程序的后端最终会是什么样子?如果它将成为 JSON API,您现在需要在 Mirage config.js
文件中做更多的工作,例如
this.get('/contacts', function(db, request) {
return {
data: db.contacts.map(attrs => {
type: 'contacts',
id: attrs.id,
attributes: attrs
})
};
});
Ember数据1.13
所以在这个主题上花了一些时间后,我找到了解决这个问题的方法。这基本上就是 ember 的工作方式。所以在引擎盖下 findAll 正在返回两个承诺。
findAll 存储中没有数据
- 从商店中查找记录(解决第一个承诺 -> 长度为 0, 因为存储中没有数据)
- 在后台获取新数据(解决第二个承诺)
在商店中查找所有数据
- 从存储中查找记录(使用缓存数据解决第一个承诺)
- 在后台获取新数据(用新的解决第二个承诺 数据)
如果您想等待所有数据加载完成,您可以使用只返回一个承诺的查询。
model() {
return this.store.query('user', {});
}
对于 findRecord,我找到了以下解决方法,只有当您的后端支持对您的记录 ID 进行任何类型的过滤时,该方法才有效。
model() {
return this.store.query('user', {
'filter[id]': 1
}).then((users) => {
return users.objectAt(0);
});
}
你可以看看github
下面的讨论Ember数据2.0
在 Ember Data 2.0 上,此问题已解决。
我在使用 Ember 和 Ember 数据版本 1.13 时遇到了与您描述的问题类似的问题。当时,我正在阅读没有 Ember Data 2.0 的 Ember 2.0 的更新文档。一旦我升级了这两个库,我就能够得到你试图用第一个代码片段实现的行为。也就是说,使用 ember 数据 2.0.
的非零记录可以正确处理承诺