Again,还是 FixtureAdpter 的 问题。
有时候我们需要 fixtures 支持 query,比如像这样:
App.SomeRoute = Ember.Route.extend({
model: function () {
return this.store.findQuery('model', { name: 'xxx' });
}
});
但是,nope!你会得到如下报错:
Error: assertion failed: Not implemented: You must override the DS.FixtureAdapter::queryFixtures method to support querying the fixture store.
Why?DS.FixtureAdapter::queryFixtures
和 findQuery
有什么关系?查看源码可知原来 findQuery
调用的正是 queryFixtures
方法,而 queryFixtures
的内容则是很幽默的:
queryFixtures: function(fixtures, query, type) {
Ember.assert('Not implemented: You must override the DS.FixtureAdapter::queryFixtures method to support querying the fixture store.');
}
不过这是可以理解的,fixtures 毕竟是伪造的 API responses,并非真正实现了后台逻辑。所以 EmberData 只为你提供了形式接口,你需要按照实际的需求自己实现它。
比如说最开始的那个例子,我们需要的无非就是从返回的数据数组中进行筛选,把值与 query 请求相等的返回出来就是了,很简单:
DS.FixtureAdapter.reopen({
queryFixtures: function (fixtures, query, type) {
fixtures.filter(function (fixture) {
var key;
for (key in query) {
if (!query.hasOwnProperty(key)) continue;
if (fixture[key] !== query[key]) return false;
}
return true;
});
}
});
queryFixture
接收到的三个参数分别是:find
回来的数据集合,你的查询条件对象,模型。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。