如何让 EmberData 的 FixtureAdapter 支持 query?

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::queryFixturesfindQuery 有什么关系?查看源码可知原来 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 回来的数据集合,你的查询条件对象,模型。

你可能感兴趣的:(ember.js)