我们的团队正在学习并采用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');
},
...
});
通过这个修改,我希望我可以通过在路由中执行此操作来修改pageIndex
和numRecords
(这导致我将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');
},
...
});
我想知道是否有更好的方法来实现这个目标?
答案 0 :(得分:0)
我没有足够的声誉发表评论,所以请原谅答案......
我可以确认没有为每个请求重新初始化适配器。
你说问题出在this.adapter.set('pageIndex', pageIndex);
行,你是对的。这是因为应用程序没有一个适配器,就像它有一个商店一样。适配器可以是应用程序范围(ApplicationAdapter),也可以是特定于模型的。每次商店收到find()
电话时,它最终会查找相应的适配器以发送电话。
因此,如果您正在使用应用程序范围的适配器,则需要引用特定的适配器(this.ApplicationAdapter.set()
)。
或者,如果您使用特定于型号的适配器,则可以引用模型本身:this.store.adapterFor(type)
其中type是您引用的DS.Model
。要以编程方式获取模型,您可以使用this.modelFor('tasks')
返回DS.Model。
如果上述方法都不适合您的应用程序,您可以将数据存储在可从适配器和路由中可靠找到的外部类中,例如您在示例中创建的配置对象。