gpt4 book ai didi

php - Backbone 模型保存状态

转载 作者:行者123 更新时间:2023-12-02 18:30:49 30 4
gpt4 key购买 nike

我使用 Backbone 模型将数据保存到服务器。然后我在 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 native 函数 split 来分隔它们。有没有更好的解决方案,比如我可以返回一个状态(指示成功或错误)和来自服务器的集合?

model code looks like:
somemodel.save({somedata},
{
success:function(a,b,c){},
error:function(b,c,d){},
wait: true
});

最佳答案

Backbone 期望 JSON 作为默认响应格式。 当你得到一个整数时,我怀疑,backbone 正在对数字使用 jquery $.parseJSON() 并将其作为有效的 JSON 返回,而事实并非如此。 如果您想返回多个错误消息,我建议您将它们放入数组的单独字段中并对它们进行编码,然后作为响应发送到主干。

编辑

刚刚检查了 Backbone 源代码,它没有调用 $.parseJOSN() ,这与上面的猜测相反。

编辑2

假设您有以下 PHP 代码(尽管我很想创建一个与框架无关的示例,但这是可能的,但使用框架会更快、更顺利,所以我选择了 Slim )。

当您保存模型时,backbone会使用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 格式的响应。我刚刚在我的一个网站上进行了测试,如果您发送与 2xx 不同的 HTTP 代码,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 以外的任何内容!

关于php - Backbone 模型保存状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17818307/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com