如何不使backbone.js使用save响应作为模型属性

时间:2011-11-06 22:05:31

标签: backbone.js

因此,当我在后端保存模型时,我的api会发回一个响应,告诉一切正常并给你一些其他json格式的指针

我的问题是骨干认为我想将该响应用作我的模型的属性并自动将它们转储到模型属性中。

我刚将它保存在前端,不想再次保存属性。

3 个答案:

答案 0 :(得分:4)

这就是Backbone.Model.parse的用途。默认情况下,它只是一个传递,所以你不需要调用“超级”。

假设你只关心两个回来的属性(id和foo),你不关心其他任何东西:

var myModel = Backbone.Model.extend({

    parse : function(resp, xhr) {
        return {
            id:  resp.id,
            foo: resp.foo
        };
    }

});

请注意,我的示例中包含“id”。创建(POST)返回id属性非常重要。没有它,Backbone模型将来不知道如何更新/删除。即使它具有不同的id名称(如“objectId”),您仍应在此函数中设置id。

答案 1 :(得分:0)

确实这是默认行为,如果你想改变它,你必须覆盖一些Backbone函数。

查看save的实施方式,您有两种选择 - 为您的模型覆盖save,或覆盖parse以使其了解您要发送的数据。 http://documentcloud.github.com/backbone/docs/backbone.html#section-41

或者,你可以放弃在响应中发送'指针',因为空响应意味着模型在保存后不会改变。

答案 2 :(得分:0)

我遇到了你遇到的确切问题。 Backbone是一个非常年轻的框架,其他事实是javascript非常动态。因此,有一千种解决问题的方法在这里非常适用。

我认为更合适的方法是使用名为Mixins的东西。这是我做的:

define([
   'underscore',
   'backbone',
   'jquery'
], function (_, Backbone, $) {

return {
    parse: function(response, xhr){
        var data = response;
        if(response.response && response.response.status != 0){
            return {};
        }
        if(response.response && response.response.data)
        {
            data = _.first(response.response.data);
            if(typeof data == 'undefined'){
                data={};
            }

        }
        if(_.isFunction(this.postParse)){
            return this.postParse.call(this, data);
        }
        return data;
    }
}
});

正如你所看到的,我已经覆盖了Backbone.Model.parse原型方法,并提出了我自己的方法,它会收到响应。并根据我的服务器规范解析响应。在这种情况下,您将实现了解服务器响应所需的一切。

在完成基础工作的情况下,指定模型非常简单:

var group = Backbone.Model.extend(
    _.extend({}, ModelMixin, {
        initialize:function () {
        }
    })
);
return group;

瞧!您需要编写的所有解析方法和检查都封装在一个ModelMixin“超类”中。