Подтвердить что ты не робот

Как сменить модель backbone.js?

У меня есть кнопка "Отмена" на моей странице, которая должна возвращать все изменения, внесенные мной в состояние, которое оно было загружено с сервера.

Думаю, мне нужно сохранить начальное состояние модели Backbonejs и восстановить текущее (измененное) состояние до начального.

Каков наилучший способ достичь этого?

Спасибо

4b9b3361

Ответ 1

FWIW - я написал плагин, чтобы обрабатывать это автоматически, особенно с идеей кнопок "отменить": http://github.com/derickbailey/backbone.memento

Ответ 2

Я не верю, что есть один вызов метода для возвращения модели в ее неотредактированное состояние. Но неотредактированные значения доступны индивидуально через model.previous(атрибут) и совместно через model.previousAttributes.

Ответ 3

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
    },

});

Ответ 4

Вот что я придумал:

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);
  }
});

Ответ 5

Взгляните на 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 обновлено и имеет варианты выбора в запрос на подтверждение до маршрутизации в новый контекст.