Ответ 1
FWIW - я написал плагин, чтобы обрабатывать это автоматически, особенно с идеей кнопок "отменить": http://github.com/derickbailey/backbone.memento
У меня есть кнопка "Отмена" на моей странице, которая должна возвращать все изменения, внесенные мной в состояние, которое оно было загружено с сервера.
Думаю, мне нужно сохранить начальное состояние модели Backbonejs и восстановить текущее (измененное) состояние до начального.
Каков наилучший способ достичь этого?
Спасибо
FWIW - я написал плагин, чтобы обрабатывать это автоматически, особенно с идеей кнопок "отменить": http://github.com/derickbailey/backbone.memento
Я не верю, что есть один вызов метода для возвращения модели в ее неотредактированное состояние. Но неотредактированные значения доступны индивидуально через model.previous(атрибут) и совместно через model.previousAttributes.
model.previousAttributes()
возвращает все предыдущие атрибуты, а model.changedAttributes()
возвращает все измененные атрибуты, но с их новыми значениями (или false
, если ничего не изменилось). Таким образом, вы можете объединить их, чтобы написать метод cancelChanges
в вашем прототипе:
var MyModel = Backbone.Model.extend({
cancelChanges: function() {
var changed = this.changedAttributes();
if(!changed)
return;
var keys = _.keys(changed);
var prev = _.pick(this.previousAttributes(), keys);
this.set(prev, {silent: true}); // "silent" is optional; prevents change event
},
});
Вот что я придумал:
var RollbackEnabledModel = Backbone.Model.extend({
initialize: function() {
this._initAttributes = _.clone(this.attributes);
},
parse: function(data) {
this._initAttributes = _.clone(data);
return data;
},
rollback: function() {
this.set(this._initAttributes);
}
});
Взгляните на NYTimes backbone.trackit. Он отслеживает несколько изменений в модели, а не только самые последние изменения, такие как model.changedAttributes()
и model.previousAttributes()
. Из README:
var model = new Backbone.Model({id:1, artist:'Samuel Beckett', 'work':'Molloy'});
model.startTracking();
model.set('work', 'Malone Dies');
console.log(model.unsavedAttributes()); // >> Object {work: "Malone Dies"}
model.set('period', 'Modernism');
console.log(model.unsavedAttributes()); // >> Object {work: "Malone Dies", period: "Modernism"}
model.save({}, {
success: function() {
console.log(model.unsavedAttributes()); // >> false
}
});
Кроме того, библиотека добавляет функциональность
resetAttributes
в их исходное состояние с момента последнего сохранения, запускает событие, когда состояниеunsavedChanges
обновлено и имеет варианты выбора в запрос на подтверждение до маршрутизации в новый контекст.