问题 如何通过保存模型获得良好的响应


使用backbone.js我正在保存模型。将PUT发送到服务器并返回响应。我第一次这样做,它返回成功,以下时间返回一个错误,因为在第一次将响应添加到模型之后。

在Backbone.js中保存功能:

saveCountry: function() {
    this.model.save({},{
        success: function(model, response) {
            console.log('success! ' + response);
        },
        error: function(model, response) {
            console.log('error! ' + response);
        }
    });
    this.render();

    return false;
},

PHP返回一个JSON字符串:

{"response": "Model saved!"}

在PUT之后得到一个错误作为响应,因为“响应”被添加到模型中:

Unknown column 'response' in 'field list'

为什么响应会添加到模型中,我该如何预防?


8243
2017-10-20 13:21


起源

难道你不能只是做一个条件并跳过你的PHP脚本中的'响应'? - swatkins
我可以,但我认为让服务器端决定响应会更干净。 - GijsjanB
你的意思是“客户”方面? - swatkins
不,我认为如果响应来自PHP(服务器端)会更干净,但是知道,正如迪拉建议的那样,我正在做客户端。 - GijsjanB


答案:


来自Backbone关于模型的文档 save

设置模型属性的哈希值,并将模型同步到服务器。如果   服务器返回不同的属性哈希,即模型的状态   将再次设置。    http://documentcloud.github.com/backbone/docs/backbone.html#section-41

如何使其工作:不要从服务器返回{“response”:“Model saved!”}。只返回没有内容的成功(状态200)。

如果保存不起作用,则返回带有错误的JSON,Backbone将使用您提供的JSON触发模型上的错误事件(请参阅 http://documentcloud.github.com/backbone/docs/backbone.html#section-41 和 http://documentcloud.github.com/backbone/docs/backbone.html#section-145)。


7
2017-10-20 13:34





只是为了复活一个古老的线索......

并不总是可以/希望更改从服务器返回的响应。

另一个解决方案是覆盖 解析 在模型中照顾这个。对于您的情况,响应不适合您的所有模型,您可以在超类中执行。

MyModel = Backbone.Model.extend({
    parse: function(data) {
        delete data["success"];
        return data;
    }
});

Address = MyModel.extend({
    saveCountry: function() {
        this.model.save({},{
            success: function(model, response) {
                console.log('success! ' + response);
            },
            error: function(model, response) {
                console.log('error! ' + response);
            }
        });
        this.render();

        return false;
    },

    ...

});

6
2018-05-25 20:21