Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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
Javascript 在backbone.js中重写sync函数时,如何处理服务器响应_Javascript_Backbone.js - Fatal编程技术网

Javascript 在backbone.js中重写sync函数时,如何处理服务器响应

Javascript 在backbone.js中重写sync函数时,如何处理服务器响应,javascript,backbone.js,Javascript,Backbone.js,我一直在尝试将我的backbone.js应用程序连接到现有的Codeigniter API。我查看了github上的todos示例,并从中构建了它。 我正在重写findAll函数,该函数在“read”时调用,并尝试获取页面并将其返回到fetch函数: findAll: function() { var url = "/folio/get/8"; var pages; var postmethod = 'GET'; $.ajax({ type:

我一直在尝试将我的backbone.js应用程序连接到现有的Codeigniter API。我查看了github上的todos示例,并从中构建了它。 我正在重写findAll函数,该函数在“read”时调用,并尝试获取页面并将其返回到fetch函数:

findAll: function() {

    var url = "/folio/get/8";
    var pages;
    var postmethod = 'GET';

    $.ajax({
         type: postmethod,
         url: url,
         async: false,
         beforeSend: function(x) {
          if(x && x.overrideMimeType) {
           x.overrideMimeType("application/j-son;charset=UTF-8");
          }
     },
     dataType: "json",
     success: function(data){
         console.debug("data", data);
         console.debug("data.pages", data.pages);
         pages = data.pages;

     }
    });

    return pages;

},
findAll:function(){ log('synch-findAll')

}

API返回如下内容-通过console.debug(“response”,response)输出:

但随后console.debug(“response.pages”,response[“pages”])打印出“undefined”。为什么会这样

提前多谢

--------------------编辑---------------------

谢谢你的回答。我可以从模型内部调用ajax的技巧非常有用。问题是,我正在尝试将多个页面合并到一个页面列表集合中:

$(function(){
  // Page Collection
  // ---------------

  var PageList = Backbone.Collection.extend({

    model: Page,
    localStorage: new Store("wickes-backbone"), // this to get hold of my overwritten localstorage file - it is not actually a localStorage

    nextOrder: function() {
      if (!this.length) return 1;
      return this.last().get('order') + 1;
    },

    comparator: function(page) {
      return page.get('order');
    }

  });

  window.Pages = new PageList;
});
  parse: function(response) {
    return response.pages
  }
因此,在appview初始化函数中,我调用

Pages.fetch();

它填充所有页面并更新视图。我真的不知道如何在模型本身中做到这一点?

我认为您的问题在于如何使用$.ajax()中的success函数:

如果您在AJAX调用中从success函数返回一些内容,它将直接进入bitbucket。这个uu.values()没有指向任何地方。$.ajax()调用的结果就是一个承诺,仅此而已。该承诺可以附加.done()、.fail()等。稍后,它还可以与.when()一起使用以及用于其他目的。但是,它与稍后将调用的success函数无关。这相当于附加到该承诺的一个.done()函数

我的猜测是,您真正想要的是AJAX完成并操作结果,然后在模型上设置它们

不过,一般来说,强制主干网同步并不是它的用途。即使您不打算使用内置在主干网中的同步并跳过获取、保存等操作,它仍然乐于接受这样的调用(请注意,模型在更新时只会更新,就像您在进行获取一样):


尝试将其添加到页面列表主干集合中:

$(function(){
  // Page Collection
  // ---------------

  var PageList = Backbone.Collection.extend({

    model: Page,
    localStorage: new Store("wickes-backbone"), // this to get hold of my overwritten localstorage file - it is not actually a localStorage

    nextOrder: function() {
      if (!this.length) return 1;
      return this.last().get('order') + 1;
    },

    comparator: function(page) {
      return page.get('order');
    }

  });

  window.Pages = new PageList;
});
  parse: function(response) {
    return response.pages
  }
这有两个作用:

  • 使用
    .pages
    引用响应中的
    pages
    数组。从您的代码中可以看出,主干网使用整体对象响应来确定集合中的对象
  • 告诉主干网使用
    页面
    数组实例化集合中的模型。它通过重写本机
    parse
    方法并返回您真正想要的内容(pages数组)来实现

  • 这样做应该将页面对象放入一个页面列表集合中。在类似的情况下,这对我很有效。希望有帮助

    好的,所以我算出了这里到底出了什么问题。正如John Munsch在第一个回答中提到的,ajax请求并不完全正确。这实际上不是主干网的问题,而是我正在进行的ajax调用的问题。首先,我将其更改为json,然后在ajax调用之外创建了一个变量“pages”,它可以记住响应并将其返回给synch函数:

    findAll: function() {
    
        var url = "/folio/get/8";
        var pages;
        var postmethod = 'GET';
    
        $.ajax({
             type: postmethod,
             url: url,
             async: false,
             beforeSend: function(x) {
              if(x && x.overrideMimeType) {
               x.overrideMimeType("application/j-son;charset=UTF-8");
              }
         },
         dataType: "json",
         success: function(data){
             console.debug("data", data);
             console.debug("data.pages", data.pages);
             pages = data.pages;
    
         }
        });
    
        return pages;
    
    },
    

    非常感谢大家的帮助,我从你们的回答中学到了很多

    您可以发布您的视图/模型吗?将代码更改为:console.debug(“response.pages”,response.pages);控制台打印:response.pages未定义,因此没有不同的结果感谢您的回答,建议可以在模型中直接与服务器通信,这非常有用。但是,我需要同时更新多个型号,不知道在没有同步功能的情况下如何更新。我编辑了上面的问题。如果你能再看一眼,我会非常感激的。
    findAll: function() {
    
        var url = "/folio/get/8";
        var pages;
        var postmethod = 'GET';
    
        $.ajax({
             type: postmethod,
             url: url,
             async: false,
             beforeSend: function(x) {
              if(x && x.overrideMimeType) {
               x.overrideMimeType("application/j-son;charset=UTF-8");
              }
         },
         dataType: "json",
         success: function(data){
             console.debug("data", data);
             console.debug("data.pages", data.pages);
             pages = data.pages;
    
         }
        });
    
        return pages;
    
    },