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