在Ember中传递'Range'标题

时间:2015-01-16 02:20:14

标签: ember.js ember-data

我们的团队正在学习并采用Ember来构建我们的应用程序,这是一次了不起的旅程。我需要通过无限滚动列表逐步获取数据,一旦用户滚动到列表的最底部,就会自动获取下一页。我们的REST端点期望传递Range标头来执行此操作,否则它将返回最多1000条记录。

到目前为止,我发现我可以在特定于模型的Adapter类中指定标头,如下所示:

App.TaskAdapter = DS.RESTAdapter.extend({
    headers: function() {
        return {
            'Range': 'items=0-9'
        };
    }
});

由于范围需要根据应用程序接下来要加载的页面进行更改,因此我将类修改为:

App.TaskAdapter = DS.RESTAdapter.extend({
    pageIndex: 0,
    numRecords: 10,

    headers: function() {
        var pageIndex = this.get('pageIndex');
        var numRecords = this.get('numRecords');
        var rangeValue = 'items=' + (pageIndex * numRecords) + '-' + (((pageIndex + 1) * numRecords) - 1);
        return {
            'Range': rangeValue
        };
    }.property().volatile()
});

App.TasksRoute = Ember.Route.extend({
    ...

    refreshModel: function(pageIndex) {
        this.adapter.set('pageIndex', pageIndex);
        this.store.find('task');
    },

    ...
});

通过这个修改,我希望我可以通过在路由中执行此操作来修改pageIndexnumRecords(这导致我将App.TaskAdapter注入App.TasksRoute })。但是,我发现this.adapter.set('pageIndex', pageIndex);没有按预期设置值,这使我认为每次商店需要获取数据时,都会实例化(来自工厂?)适配器。我可能完全错了。

因为我无法使它工作,所以我最终得到了一个帮助类TaskAdapterConfig(注入到路线中)来做这件事。

App.TaskAdapter = DS.RESTAdapter.extend({
    pageIndex: 0,
    numRecords: 10,

    headers: function() {
        var pageIndex = this.config.get('pageIndex');
        var numRecords = this.config.get('numRecords');
        var rangeValue = 'items=' + (pageIndex * numRecords) + '-' + (((pageIndex + 1) * numRecords) - 1);
        return {
            'Range': rangeValue
        };
    }.property().volatile()
});

App.TaskAdapterConfig = Ember.Object.extend({
    pageIndex: 0,
    numRecords: 10
});

App.TasksRoute = Ember.Route.extend({
    ...

    refreshModel: function(pageIndex) {
        this.adapterConfig.set('pageIndex', pageIndex);
        this.store.find('task');
    },

    ...
});

我想知道是否有更好的方法来实现这个目标?

1 个答案:

答案 0 :(得分:0)

我没有足够的声誉发表评论,所以请原谅答案......

我可以确认没有为每个请求重新初始化适配器。

你说问题出在this.adapter.set('pageIndex', pageIndex);行,你是对的。这是因为应用程序没有一个适配器,就像它有一个商店一样。适配器可以是应用程序范围(ApplicationAdapter),也可以是特定于模型的。每次商店收到find()电话时,它最终会查找相应的适配器以发送电话。

因此,如果您正在使用应用程序范围的适配器,则需要引用特定的适配器(this.ApplicationAdapter.set())。

或者,如果您使用特定于型号的适配器,则可以引用模型本身:this.store.adapterFor(type)其中type是您引用的DS.Model。要以编程方式获取模型,您可以使用this.modelFor('tasks')返回DS.Model。

如果上述方法都不适合您的应用程序,您可以将数据存储在可从适配器和路由中可靠找到的外部类中,例如您在示例中创建的配置对象。