0

我使用骨干模型将数据保存到服务器。然后我在保存(发布)后处理成功或错误回调并设置等待:真。我的问题是为什么骨干模型只在服务器返回字符串时触发错误回调?当服务器返回一个 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 原生函数 split 来分隔它们。有没有更好的解决方案,比如我可以返回一个状态(指示成功或错误)和来自服务器的集合?

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

1 回答 1

2

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

编辑

刚刚检查了主干源代码,它并没有$.parseJOSN()与上面的猜测相反。

编辑 2

假设您有以下 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 格式的响应。我刚刚在我的一个网站上进行了测试,如果您发送不同于 2xx 的 HTTP 代码,Backbone 实际上会调用error而不是success. 但浏览器也会捕获该 HTTP 代码,所以要小心!

删除信息

骨干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 以外的任何内容!

于 2013-07-23T18:44:18.680 回答