Nie musisz zapisywać całego modelu na serwerze tylko po to, aby zmienić jedną rzecz, możesz (i powinieneś w tym przypadku) dodać upVote
metody do modelu, która wykonuje wywołanie AJAX „zwiększenie głosów za” na serwerze. W swoim modelu miałbyś coś takiego:
upVote: function() {
var self = this;
$.ajax({
url: '/some/upvote/path',
type: 'POST',
success: function(data) {
self.set('upVotes', data.upVotes);
},
// ...
});
}
A wtedy widok będzie miał to do obsługi akcji upvote:
upVote: function() {
// Highlight the upvote button or provide some other feedback that
// the upvote has been seen.
this.model.upVote();
}
i prawdopodobnie miałbyś detektor zdarzeń zmian w upVotes
modelu właściwość, aby poprawnie zwiększyć wyświetlany licznik głosów za (jeśli masz coś takiego).
Ponadto Twój /some/upvote/path
na serwerze po prostu wyśle $inc
aktualizacja
do MongoDB, aby uniknąć tego samego problemu "dwie rzeczy dzieją się na raz" na twoim serwerze. Jeśli korzystasz z relacyjnej bazy danych, chciałbyś zrobić coś takiego jak update t set upvotes = upvotes + 1 where id = ?
.
W przypadku prostej operacji inkrementacji nie ma potrzeby wykonywania w obie strony „zapytania, aktualizacji, zapisania” ani na kliencie, ani na serwerze. Zamiast tego potraktuj przyrost jako pojedynczą operację inkrementacji i przesuń ten przyrost aż do ostatniej trwałej warstwy przechowywania danych.