骨干模型保存状态

时间:2013-07-23 18:34:51

标签: php javascript rest backbone.js

我使用骨干模型将数据保存到服务器。然后我在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
    });

1 个答案:

答案 0 :(得分:2)

Backbone希望JSON成为默认的响应格式。 当你得到一个整数时,我怀疑,骨干在数字上使用jquery $.parseJSON()并将其作为有效的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格式的响应。我刚刚在我的一个网站上测试过,如果您发送的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以外的任何内容!