使用Backbone.js的投票系统

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 = ?.

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