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