Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ember.js 服务器端分页_Ember.js_Ember Data - Fatal编程技术网

Ember.js 服务器端分页

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

我不是试图在视图本身中提供分页

我的API一次返回500条记录,如果有更多记录,我想自动加载它们

虽然我现在的解决方案确实提出了要求,但我认为这不是最好的方法,但它确实有效

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;
    });
  }
});
我的问题是:

  • 是否有更好的方法自动获取给定请求的所有页面
  • 我如何正确地确保建立关系。我的
    结构
    对象上有父/子关系,但实际上只有结果的第一页被正确关联
更新 下面是我的json响应的样子:

{
    "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的帮助。这让我找到了一个更干净的解决方案。我现在可以手动添加对象,直到余烬数据得到修复。