Ran*_*lue 3 mongodb backbone.js
我有一个Book拥有该属性的模型upVotes.Book可以从数据库(MongoDB)查询,修改,然后保存实例.如果用户赞成书籍,我会更新upVotes计数,并将整个模型保存回服务器.
问题是,如果其他人在加载实例的时间和实例保存的时间之间进行投票,那么这两个投票将保存为一票.我需要的是一种简单的方法来说"通过1个服务器端增加模型",而不是"通过1个客户端增加模型并希望不存在冲突".
mu *_*ort 11
您不必将整个模型保存到服务器只是为了改变一件事,您可以(并且在这种情况下应该)upVote向您的模型添加一个方法,该方法对您的服务器执行"增量upvotes"AJAX调用.在你的模型中你会有这样的东西:
upVote: function() {
var self = this;
$.ajax({
url: '/some/upvote/path',
type: 'POST',
success: function(data) {
self.set('upVotes', data.upVotes);
},
// ...
});
}
Run Code Online (Sandbox Code Playgroud)
然后视图将有此处理upvote操作:
upVote: function() {
// Highlight the upvote button or provide some other feedback that
// the upvote has been seen.
this.model.upVote();
}
Run Code Online (Sandbox Code Playgroud)
并且您可能在模型upVotes属性上有一个更改事件的监听器,以正确递增显示的upvote计数器(如果您有这样的事情).
此外,您/some/upvote/path在服务器上只会向MongoDB 发送$inc更新,以避免服务器上出现"同时发生的两件事"问题.如果您使用的是关系数据库,那么您最终会想要做类似的事情update t set upvotes = upvotes + 1 where id = ?.
对于简单的增量操作,不需要在客户端或服务器上进行"查询,更新,保存"往返.相反,将增量视为单个增量操作,并将该增量一直向下推送到最终的持久数据存储层.