仅在Backbone.js中保存更改的属性

时间:2012-10-29 16:35:40

标签: javascript backbone.js

我试图通过执行以下操作仅保存模型的已更改属性:

        this.model.set("likes", this.model.get("likes") + 1);
        this.model.save();

并像这样扩展Backbone原型:

var backbone_common_extension = {
    sync: function(method,model,options) {
        options.contentType = 'application/json';
        if (method == 'update') {
            options.data = JSON.stringify(model.changedAttributes() || {});
        }
        console.log(options.data);
        Backbone.sync.call(this, method, model, options);
    }
};

_.extend(Backbone.Model.prototype, backbone_common_extension);

问题是model.changedAttributes()总是为空。我尝试在set方法上传递{silent:true},但同样的事情。如何防止主干在同步之前清除changedAttributes()?

1 个答案:

答案 0 :(得分:5)

依赖于changedAttributes这种事情往往不能很好地工作,Backbone实际上没有一个定义明确的set / commit / save / rollback系统,所以你会发现changedAttributes当你不指望它时会被清空。

幸运的是,没关系;不幸的是,这并不重要,因为你的整个方法都是错误的。如果您从服务器加载模型然后从其他浏览器进来的五个喜欢会发生什么?你的方法会覆盖所有喜欢的东西,数据会丢失。

你应该让服务器管理喜欢的总数,你的模型应该简单地发送一点“还有一个喜欢”的消息,让服务器响应新的总数。我会更喜欢这样做:

// On the appropriate model...
add_like: function() {
    var _this = this;
    $.ajax({
        type: 'post',
        url: '/some/url/that/increments/the/likes',
        success: function(data) {
            _this.set('likes', data.likes);
        },
        error: function() {
            // Whatever you need...
        }
    });
}

然后服务器上的/some/url/...处理程序将向其数据库发送一个简单的“添加一个”更新,并发回更新的喜欢数量。这使数据库负责管理数据和并发问题;数据库擅长这种事情,客户端JavaScript并没有那么多。