Ember数据:如何手动调用DS.RESTAdapter的“findMany”?

时间:2013-06-09 20:02:10

标签: ember.js ember-data

我成功使用了Ember Data的DS.RESTAdapter。该适配器有一个名为findMany的方法。

只要访问某个模型实例的hasMany关系,就会在幕后使用该方法:findMany获取关系中已存在的一组裸ID以查询远程服务器所有这些ID的完整数据in one bulk AJAX request-response

在我的Ember应用中,我现在需要查询一组ID 手动。应用程序从任何其他地方获取这些ID,在任何Ember Data模型实例的关系之外。

如果有助于可视化此要求,请想象一个用户输入以逗号分隔的ID列表,让Ember Data通过查询远程服务器来查找这些ID,然后使用Ember Data添加返回的数据某些模型实例的关系。

因此:如何批量查询一组ID,最好是利用DS.RESTAdapter.findMany,然后将返回的Ember数据实例添加到某个模型实例的关系中?

TL; DR :我正在寻找类似App.MyModelType.**findMany**(234, 583, 234)的内容,但我不想循环App.MyModelType.find,因为这对大型网站来说效率不高ID数量。

1 个答案:

答案 0 :(得分:0)

对于2013-06-25之前约会的Ember Data版本,在定义任何Ember Data模型类之前,将以下代码添加到app.js

DS.Model.reopenClass({
    findMany: function(ids) {
        //taken from model.js's storeAlias(..)

        var store = Ember.get(DS, 'defaultStore'),
            args = [].slice.call(arguments);

        args.unshift(this);
        Ember.assert("Your application does not have a 'Store' property defined. Attempts to call 'findMany' on model classes will fail. Please provide one as with 'YourAppName.Store = DS.Store.extend()'", !!store);

        return store["findMany"].apply(store, args);
    }
});

//begin definition of App.MyModelType = DS.Model.extend({..}); here

store.findMany(..)将确定哪些ID尚未在商店中加载记录。 对于这些已卸载的记录,store.findMany(..)会调用store.fetchMany(..) store.fetchMany(..)将使用adapter.findMany(..)将查找逻辑委派给已使用的DS.Adapter实现。

如果findMany超出DS.Model超类型,您现在可以使用App.MyModelType.findMany(..)并返回一组模型实例,例如

var someArrayWithIds = [1, 2, 3];
someModelInstances = App.MyModelType.findMany(someArrayWithIds);