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

История/Отмена EmberJS

Изменить: я сделал свою собственную реализацию, которая находится на GitHub

Мне было интересно, есть ли встроенная функция в ember, которая позволяет сохранять состояния объектов/массивов? В нашем приложении мы создали свою собственную реализацию undo/history для конкретного Ember.ArrayController, но, похоже, он глючит и работает медленно (в Firefox). Поэтому мне интересно, есть ли что-нибудь, что заменит наш script.

В основном мы используем его для: Пользователи добавляют, редактируют, изменяют элементы в этом массиве, и иногда они хотели бы отменить/изменить свои изменения. В настоящий момент мы ограничиваем количество состояний до 30 (может быть, не оптимальное количество).

Любые мысли/ссылки оценены!

4b9b3361

Ответ 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