我使用骨干模型将数据保存到服务器。然后我在save(post)之后处理成功或错误回调并设置wait:true。我的问题是为什么骨干模型只在服务器返回字符串时触发错误回调?当服务器返回一个json或任何数字时,它将成功。问题是,如果我想返回一个多重错误消息,并且我想将所有错误消息放入集合(json),它将永远不会进入错误回调。示例代码如
echo 'success'; //actually it will go to error callback cuz it return a string(any string)
echo json_encode($some_array); // it will go to success
echo 200/anynumber; // it will go to sucess
我的解决方案是,如果我想返回多条消息,我可以通过分隔符分隔这些消息,并使用javascript本机函数拆分来分隔它们。有没有更好的解决方案,比如我可以返回状态(表示成功或错误)和来自服务器的集合?
model code looks like:
somemodel.save({somedata},
{
success:function(a,b,c){},
error:function(b,c,d){},
wait: true
});
答案 0 :(得分:2)
Backbone希望JSON成为默认的响应格式。 当你得到一个整数时,我怀疑,骨干在数字上使用jquery
如果你想返回多个错误消息,我建议你把它们放在一个数组的单独字段中,然后对它们进行编码,然后作为响应发送给主干。$.parseJSON()
并将其作为有效的JSON返回,而不是。
刚刚检查了主干源代码,它没有调用$.parseJOSN()
与上面猜到的相反。
假设您有以下PHP代码(尽管我想创建一个框架无关的示例,但它可以使用框架更快更顺畅,所以我选择Slim)。
保存模型时,骨干使用POST作为方法将数据发送到服务器。在Slim中,这将转化为以下内容:
$app = new \Slim\Slim();
$app->post('/authors/', function() use($app) {
// We get the request data from backbone in $request
$request = $app->request()->getBody();
// We decode them into a PHP object
$requestData = json_decode($request);
// We put the response object in $response : this will allow us to set the response data like header values, etc
$response = $app->response();
// You do all the awesome stuff here and get an array containing data in $data //
// Sample $data in case of success
$data = array(
'code' => 200,
'status' => 'OK',
'data' => array('id'=>1, 'name' => 'John Doe')
);
// sample $data in case of error
$data = array(
'code' => 500,
'status' => 'Internal Server Error',
'message' => 'We were unable to reach the data server, please try again later'
);
// Then you set the content type
$app->contentType('application/json');
// Don't forget to add the HTTP code, Backbone.js will call "success" only if it has 2xx HTTP code
$app->response()->status( $data['code']);
// And finally send the data
$response->write($data);
我使用Slim只是因为它完成了工作,所有内容都应该像英语一样。
如您所见,Backbone需要JSON格式的响应。我刚刚在我的一个网站上测试过,如果您发送的HTTP代码与2xx不同,Backbone实际上会调用error
而不是success
。但浏览器也会捕获该HTTP代码,所以请注意!
删除信息
Backbone parse
函数也将期待JSON!
假设我们有这个集合:
var AuthorsCollection = Backbone.Collection.extend({
initialize: function( models, options ) {
this.batch = options.batch
},
url: function() {
return '/authors/' + this.batch;
},
// Parse here allows us to play with the response as long as "response" is a JSON object. Otherwise, Backbone will automatically call the "error" function on whatever, say view, is using this collection.
parse: function( response ) {
return response.data;
}
});
parse
允许您检查响应,但不会接受除JSON以外的任何内容!