使用Backbone.js的投票系统

时间:2011-12-31 15:53:20

标签: mongodb backbone.js

我有Book模型,其属性为upVotes。可以从数据库(MongoDB)查询Book个实例,进行修改,然后保存。如果用户赞成书籍,我会更新upVotes计数,并将整个模型保存回服务器。

问题在于,如果其他人在加载实例的时间和实例保存的时间之间进行投票,那么这两个投票将保存为一票。我需要的是一种简单的方法来说“通过1个服务器端增加模型”,而不是“通过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 = ?

之类的操作

对于简单的增量操作,无需在客户端或服务器上进行“查询,更新,保存”往返。相反,将增量视为单个增量操作,并将该增量一直向下推送到最终的持久数据存储层。