Как клонировать модели в магистрали
У меня есть модель, которая может быть отредактирована определенным представлением; однако в нижней части окна пользователь должен получить возможность сохранить или отменить все изменения. Это означает, что вам нужно будет сохранить список всех изменений, которые должны быть внесены в модель, и затем внести эти изменения только после нажатия кнопки "Сохранить". Это звучит излишне сложно, и я придумал альтернативный подход, который заключается в создании клона модели и внесении изменений в это в представлении. Затем, если пользователь нажимает "Сохранить", удаляет старую модель и заменяет ее в своей коллекции новой, иначе вы отбрасываете клонированную модель.
Это приемлемый подход, и если да, то как я могу реализовать процесс клонирования?
Это будет эквивалентно извлечению данных с сервера снова (но лишний HTTP-запрос кажется ненужным).
Ответы
Ответ 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 );
}
});