Ответ 1
Я реализовал mixin "Memento", который отслеживает изменения свойств, определенных в массиве mementoProperties
. Он поддерживает нормальные свойства, а также свойства массива.
Основная идея заключается в следующем: когда инициализируется mixin, он регистрируется как наблюдатель для изменений свойств. Изменение свойства добавляет новый элемент в массив memento
, который представляет историю внесенных изменений. Вызов undo
устанавливает свойство в состояние до того, как было выполнено изменение. redo
соответственно сбрасывает значение.
mixin размещен на GitHub в ember-memento. Его можно использовать следующим образом, см. http://jsfiddle.net/pangratz666/9fa95/:
App.obj = Ember.Object.create(Ember.Memento, {
name: 'hello',
myArray: [],
age: 12,
mementoProperties: 'name age myArray'.w()
});
App.obj.get('myArray').pushObject(1);
App.obj.get('myArray').pushObject(2);
App.obj.get('myArray').pushObject(3);
App.obj.set('name', 'hubert');
App.obj.get('myArray').pushObject(4);
App.obj.set('age', 190);
App.obj.get('myArray').pushObjects(['a', 'b']);
App.obj.undo(); // myArray = [1,2,3,4]
App.obj.undo(); // age = 12
App.obj.undo(); // myArray = [1,2,3]
App.obj.undo(); // name = 'hello'
App.obj.redo(); // name = 'hubert'
App.obj.redo(); // myArray = [1,2,3,4]
App.obj.redo(); // age = 190