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

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

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

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

Любые мысли/ссылки приветствуются!


person Ignas    schedule 11.05.2012    source источник


Ответы (1)


Я реализовал миксин "Memento", который отслеживает изменения свойств, определенных в массиве mementoProperties. Он поддерживает свойства обычные, а также свойства массива.

Основная идея заключается в следующем: когда миксин инициализируется, он регистрируется как наблюдатель за изменениями свойств. Изменение свойства добавляет новый элемент в массив memento, который представляет историю внесенных изменений. Вызов undo устанавливает свойство в состояние до внесения изменения. redo соответственно сбрасывает значение.

миксин размещен на 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
person pangratz    schedule 14.05.2012
comment
Само решение замечательное, однако, поскольку у ember нет чего-то вроде updateProperties вместо setProperties, я не могу вносить несколько изменений в объект и не запускать наблюдателей несколько раз. Хотя ваше решение работает так, как ожидалось! Большое спасибо! - person Ignas; 16.05.2012
comment
Я обновил миксин и добавил метод updateProperties, который добавляет только 1 элемент истории для нескольких изменений значений. Если у вас есть какие-либо дополнительные предложения, пожалуйста, откройте вопрос в репо. Ваше здоровье! - person pangratz; 16.05.2012
comment
Я создал аналогичную реализацию, просто намного проще, чем ваша. Моя реализация предназначена для глобальной истории, а не только для объекта. Загляните на github.com/ignasbernotas/ember-history :) - person Ignas; 28.06.2012
comment
@Игнас Хорошо! Не забудьте добавить его на github.com/emberjs/ember.js/wiki/ Модули - person pangratz; 28.06.2012