Ember.js 服务器端分页
我不是试图在视图本身中提供分页 我的API一次返回500条记录,如果有更多记录,我想自动加载它们 虽然我现在的解决方案确实提出了要求,但我认为这不是最好的方法,但它确实有效Ember.js 服务器端分页,ember.js,ember-data,Ember.js,Ember Data,我不是试图在视图本身中提供分页 我的API一次返回500条记录,如果有更多记录,我想自动加载它们 虽然我现在的解决方案确实提出了要求,但我认为这不是最好的方法,但它确实有效 App.StructureAdapter = App.ApplicationAdapter.extend({ findHasMany: function(store, record, url) { // based on the normal `findHasMany` code var host = E
App.StructureAdapter = App.ApplicationAdapter.extend({
findHasMany: function(store, record, url) {
// based on the normal `findHasMany` code
var host = Em.get(this, 'host'),
id = Em.get(record, 'id'),
type = record.constructor.typeKey;
if (host && url.charAt(0) === '/' && url.charAt(1) !== '/') {
url = host + url;
}
return this.findWithURL(this.urlPrefix(url, this.buildURL(type, id)), 1);
},
findWithURL: function(url, page) {
var that = this;
var completeUrl = url + "?page=" + page;
var nextPage = page + 1;
return this.ajax(completeUrl, 'GET').then(function(data) {
Em.Logger.log("calling then");
if (data.structures.length > 0){
that.findWithURL(url, nextPage);
}
return data;
});
}
});
我的问题是:
- 是否有更好的方法自动获取给定请求的所有页面
- 我如何正确地确保建立关系。我的
对象上有父/子关系,但实际上只有结果的第一页被正确关联结构
{
"structures": [
{
"id": 6536,
"name": "Building",
"updated_at": "2013-05-21T07:14:54-06:00",
"person_id": 6535,
"notes": ""
},
... 499 more objects ...
]
}
它工作正常,第一组负载正常。如果需要,我可以在extract
/normalize
方法中对其进行调整
以下是我目前的规格化方法:
App.StructureSerializer = App.ApplicationSerializer.extend({
normalize: function(type, hash, prop) {
// adds the properly link to get children
hash.links = { "children": "structures" };
// change structure_id to parent_id
hash.parent_id = hash.structure_id;
delete hash.structure_id;
return this._super(type, hash, prop);
},
});
同样,链接使它自动知道在何处查找具有多个关系的对象
仔细看,尽管分页的页面实际上会被调用,但它们根本不会加载到余烬数据中。因此,如果他们真的被加载了,那么他们之间的关系就会建立得很好 我真的不喜欢这个解决方案,但它确实有效。请张贴,如果你有一个更干净的方式做这件事 步骤1:将数据加载到余烬数据中 由于数据没有被加载到其他页面的余烬数据中,我不得不手动加载它。我通过调整我在上面创建的
findWithURL
函数实现了这一点
findWithURL: function(url, page) {
var that = this;
var completeUrl = url + "?page=" + page;
var nextPage = page + 1;
var store = EditUserApp.__container__.lookup('store:main');
return this.ajax(completeUrl, 'GET').then(function(data) {
if (data.structures.length > 0){
that.findWithURL(url, nextPage);
}
store.pushPayload('structure', data);
return data;
});
},
我觉得应该有一个更干净的方法来做到这一点,但它的工作
步骤2:重建关系
出于某种原因,它似乎没有重建子/父关系。为了解决这个问题,我必须在结构
模型内部使用didLoad
回调
didLoad: function() {
var parent = this.get('parent');
if (parent) {
var that = this;
parent.get('children').then(function(children) {
children.addObject(that);
});
}
},
欢迎对如何改进此解决方案提出任何建议。理想情况下,我觉得应该有一个更好的余烬方法来处理整个场景。这是我最好的想法,我不知道它会有多好,你可能需要好好玩玩一下 在您的
结构路由中
,继续并将模型恢复为正常,以便:
App.StructureRoute = Ember.Route.extend({
model:function() {
return this.store.find('structure');
}
});
这将获取前500个对象并开始路由转换
然后在您的StructureController
中,使用如下查询参数获取其他模型:
App.StructureController = Ember.ArrayController.extend({
init:function() {
this.loadNextPage(2);
this._super(); // this may not be necessary still, but the docs call for it
},
loadNextPage: function(page) {
var self = this;
var promise = this.store.find('structure',{page:page});
promise.then(function(structures) {
if(structures.get('length') < 500) {
self.loadNextPage(page + 1);
}
});
}
});
App.StructureController=Ember.ArrayController.extend({
init:function(){
本文件为第二页(2);
this._super();//这可能仍然没有必要,但文档需要它
},
loadNextPage:功能(第页){
var self=这个;
var promise=this.store.find('structure',{page:page});
承诺。然后(功能(结构){
if(structures.get('length')<500{
自加载下一页(第+1页);
}
});
}
});
因此,当StructureController
启动时,它将调用递归函数loadNextPage
。这将一直运行,直到它到达一个包含少于500个模型的页面。希望这将是最后一页。到,Ember应触发对/structure?page=2
的请求。相反,如果您不介意缓慢的加载时间,您可以在路线中完成所有这些
如果可能的话,我建议修改API,在请求中添加一些分页元数据。然后可以使用该元数据控制何时停止递归函数。你可以看到
最后,我不确定这是否是json中的输入错误,但您可能需要这样做
不管是谁,希望这对我有帮助,我没有过分简单的问题 您可以发布从服务器收到的json响应吗?您的模型是什么样子的?您好@NicholasJohn16,我刚刚添加了JSON响应。您正在使用吗?是的,我正在使用余烬数据。@RyanJM我最近也对祖先/自连接关系做了一些工作。我没有发现我必须使用normalize函数;所以我不确定我的示例应用程序是否会对您有所帮助,或者您是否使用了我没有想到的更好的方法。这是以防万一的链接:尼古拉斯,谢谢你的回答。不知道为什么我没早点看到。我必须试一下,但我认为这比我试过的要好得多看起来这和我的问题一样。我不是在做数组控制器,我是在做ObjectController,然后在子对象上循环。执行此查找时,不会更新子关系。如果要表示多个模型,则应使用ArrayController。为什么要使用ObjectController?我正在展示一个树状结构。父对象(ObjectController),在子对象上循环(每个子对象都有自己的ObjectController)。我需要一个ObjectController,以便根据用户正在使用的特定结构提供功能。感谢Nicholas的帮助。这让我找到了一个更干净的解决方案。我现在可以手动添加对象,直到余烬数据得到修复。