Система голосования с Backbone.js - PullRequest
3 голосов
/ 31 декабря 2011

У меня есть Book модель со свойством upVotes.Book экземпляры могут быть запрошены из базы данных (MongoDB), изменены, а затем сохранены.Если пользователь проголосует за книгу, я обновлю счет upVotes и сохраню всю модель обратно на сервер.

Проблема состоит в том, что если кто-то еще проголосует между временем загрузки экземпляра и временемэкземпляр будет сохранен, тогда два голоса будут сохранены как один голос.Что мне нужно, так это простой способ сказать «увеличить модель на 1 сторону сервера» вместо «увеличить модель на 1 сторону клиента и надеяться, что конфликта не будет».

1 Ответ

11 голосов
/ 31 декабря 2011

Вам не нужно сохранять всю модель на сервере только для того, чтобы изменить что-то одно, вы можете (и должны в этом случае) добавить в вашу модель метод upVote, который выполняет AJAX-вызов "increment upvotes"ваш сервер.В вашей модели у вас будет что-то вроде этого:

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 модели правильно увеличивали отображаемый счетчик повышений (если у вас есть такая вещь).

Кроме того, ваш /some/upvote/path на сервере просто отправит $inc обновите в MongoDB, чтобы избежать той же проблемы "две вещи происходят одновременно" на вашем сервере.Если бы вы использовали реляционную базу данных, вы бы хотели сделать что-то вроде update t set upvotes = upvotes + 1 where id = ?.

Нет необходимости в двустороннем запросе «запрос, обновление, сохранение» на клиенте или сервере.для простой операции приращения.Вместо этого обрабатывайте приращение как одну операцию приращения и перемещайте это приращение до конечного уровня постоянного хранения данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...