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

Как клонировать модели в магистрали

У меня есть модель, которая может быть отредактирована определенным представлением; однако в нижней части окна пользователь должен получить возможность сохранить или отменить все изменения. Это означает, что вам нужно будет сохранить список всех изменений, которые должны быть внесены в модель, и затем внести эти изменения только после нажатия кнопки "Сохранить". Это звучит излишне сложно, и я придумал альтернативный подход, который заключается в создании клона модели и внесении изменений в это в представлении. Затем, если пользователь нажимает "Сохранить", удаляет старую модель и заменяет ее в своей коллекции новой, иначе вы отбрасываете клонированную модель.

Это приемлемый подход, и если да, то как я могу реализовать процесс клонирования?

Это будет эквивалентно извлечению данных с сервера снова (но лишний HTTP-запрос кажется ненужным).

4b9b3361

Ответ 1

Вы можете использовать метод clone. Ниже приведен короткий пример:

var Model = Backbone.Model.extend({});
var View = Backbone.View.extend({
    initialize: function() {
        this.realModel = this.model;
        this.model = this.realModel.clone();
    },
    onSave: function() {
        this.realModel.set(this.model.attributes);
    }
});

Вы также можете сделать что-то другое:

var Model = Backbone.Model.extend({});
var View = Backbone.View.extend({
    initialize: function() {
        // save the attributes up front, removing references
        this._modelAttributes = _.extend({}, this.model.attributes);
    },
    onSave: function() {
        // revert to initial state.
        this.model.set(this._modelAttributes);
    }
});

Ответ 2

Вы можете попробовать Backbone.Memento попробовать.

Если вы не хотите использовать его без проблем. Но, вы можете получить хорошее представление о том, как это должно быть сделано из кодовой базы.

Ответ 3

Обычно я решаю эту проблему с кешем объекта в представлении. Таким образом, я не добавляю лишних накладных расходов для управления моделью/просмотром. Отмена происходит естественным образом, если пользователь закрывает представление без сохранения.

var Model = Backbone.Model.extend({
    'title': 'Hello'
});

var View = Backbone.View.extend({
    initialize: function() {

        // Holds temporary values until save
        this.cache = {};

    },
    onTitle: function() {
        this.cache.title = 'World';
    },
    onSave: function() {
       this.model.set( this.cache );
    }
});