gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 17:20:51 25 4
gpt4 key购买 nike

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

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

并像这样扩展 Backbone 原型(prototype):

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

最佳答案

依靠 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 则不太擅长。

关于javascript - 仅在 Backbone.js 中保存更改的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13125838/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com