Javascript 在backbone.js中重写sync函数时,如何处理服务器响应
我一直在尝试将我的backbone.js应用程序连接到现有的Codeigniter API。我查看了github上的todos示例,并从中构建了它。 我正在重写findAll函数,该函数在“read”时调用,并尝试获取页面并将其返回到fetch函数: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:
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;
},