在用Backbone时发现了一个很奇怪的事情,各种纠结,各种google,最郁闷的是让我遇到了"传说中开发最郁闷的事:发现了一个问题,google后发现有人在stackoverflow上提了一个相同的问题,但是...没有人回答".还好,最后解决了,记录下,方便下后来人.
前端js我是像这样写的:
var Book = Backbone.Model.extend({
url:'/test.php',
initialize:function(){
this.fetch({
success:function(models,resp){
console.log('success');
},
error:function(){
console.log('error');
}
});
}
});
var book = new Book;
服务端我简单粗暴这样写的:
<?php
header('Content-Type:application/json');
echo "{name:'Scofield',age:1}";
exit;
结果怪事发生了,终端里面一直都是直接进入了error,而看终端上面ajax回来的数据正常,HTTP状态码也是200,怪了.一番纠结后,在stackoverflow上的一个回答提示了我,于是我在fetch的时候添加了一个complete事件,代码如下:
//省略
this.fetch({
success:function(models,resp){
console.log('success');
},
error:function(){
console.log('error');
},
complete:function(xhr,status){
console.log(status);
}
});
//省略
运行后发现status的结果为parseerror,好了,再次google了下parserror这个东西,发现时json解析错误导致.好吧,原来是服务端返回的数据有问题.于是修改了下服务端的数据:
<?php
header('Content-Type:application/json');
echo json_encode((object)array(
'name' => 'Scofield',
'age' => 1
));
exit;
测试,终端看到直接进入success的流程了.但是我明明在服务端告诉了ajax哥返回的就是json啊,奇了怪了,然后仔细查看了下我两次分别返回回来的值,发现了一个现象,parseerror时返回来的值是这样的:
"{name:'Scofield',age:1}"
而解析成功时返回的值是这样的:
"{name:"Scofield",age:1}"
会不会是单引号的原因呢?于是我便把第一次服务端代码改成了这样:
echo "{name:\"Scofield\",age:1}";
OK,成功了.Google了下才知道原来JSON的格式是用双引号的,如果用单引号会有问题...