2012-05-11 9 views
12

Edición: He hecho mi propia aplicación que se encuentra en GitHubEmberJS Historia/Deshacer

Me preguntaba, ¿hay una característica integrada en la brasa que permite guardar los estados de objetos/matrices? En nuestra aplicación, hemos creado nuestra propia implementación de deshacer/historial para un Ember.ArrayController particular, pero parece tener errores y es lenta (en Firefox). Entonces me pregunto si hay algo que pueda reemplazar nuestro guión.

Básicamente lo que usamos para: Los usuarios agregan, editan, modifican elementos en esa matriz y a veces les gustaría deshacer/rehacer sus cambios. Por el momento, limitamos la cantidad de estados a 30 (puede no ser la cantidad óptima).

¡Se agradecen todos los pensamientos/enlaces!

Respuesta

12

Implementé un mixin "Memento" que rastrea los cambios de las propiedades definidas en mementoProperties array. Es compatible con propiedades normales, así como propiedades de matriz.

La idea básica es la siguiente: cuando la mixin se inicializa, se registra como observador de los cambios de propiedad. Un cambio de propiedad agrega un nuevo elemento a la matriz memento que representa el historial de los cambios realizados. Invocar undo establece la propiedad en el estado antes de que se haya realizado el cambio. redo respectivamente restablece el valor.

El mixin está alojado en GitHub en ember-memento. Puede ser utilizado de la siguiente manera, ver 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 
+0

La solución en sí es impresionante, sin embargo debido a brasa no tiene algo así como updateProperties en lugar de setProperties, no puedo hacer varios cambios en el objeto y no activar los múltiples observadores veces. ¡Aunque tu solución funciona como se esperaba! ¡Muchas gracias! – Ignas

+1

He actualizado la mezcla y agregado un método 'updateProperties' que solo agrega 1 elemento de historial para múltiples cambios de valores. Si tiene más sugerencias, abra un problema en el repositorio. ¡Aclamaciones! – pangratz

+3

He creado una implementación similar mucho más simple que la tuya. Mi implementación es para la historia global no solo para un objeto. Compruébelo https://github.com/ignasbernotas/ember-history/ :) – Ignas

Cuestiones relacionadas