2

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

        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()?

4

1 回答 1

5

依靠changedAttributes这种东西往往不能很好地工作,Backbone 并没有真正定义好的设置/提交/保存/回滚系统,所以你会发现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 则不然。

于 2012-10-29T18:15:21.193 回答