Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 仅在Backbone.js中保存更改的属性_Javascript_Backbone.js - Fatal编程技术网

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

Javascript 仅在Backbone.js中保存更改的属性,javascript,backbone.js,Javascript,Backbone.js,我试图通过执行以下操作仅保存模型的已更改属性: this.model.set("likes", this.model.get("likes") + 1); this.model.save(); 并扩展主干原型,如下所示: var backbone_common_extension = { sync: function(method,model,options) { options.contentType = 'application/js

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

        this.model.set("likes", this.model.get("likes") + 1);
        this.model.save();
并扩展主干原型,如下所示:

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(),主干网实际上没有一个定义良好的set/commit/save/rollback系统,因此您会发现
changedAttributes
在您不希望它空时会被清空

幸运的是,这并不重要;不幸的是,这并不重要,因为你的整个方法都是错误的。如果从服务器加载模型,然后从其他浏览器输入五个like,会发生什么?您的方法将覆盖所有这些内容,数据将丢失

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

// 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/…
处理程序将向其数据库发送一个简单的“addone”更新,并将更新后的like数发回。这使得数据库负责管理数据和并发问题;数据库在这方面做得很好,客户端JavaScript就不多了