2012-05-11 7 views
12

Edit: Ho fatto la mia propria implementazione che è sulla GitHubEmberJS Storia/Annulla

Mi chiedevo, c'è un built-in funzione di brace che permette di salvare gli stati di oggetti/array? Nella nostra app abbiamo costruito la nostra implementazione di annullamento/cronologia per un particolare Ember.ArrayController, ma sembra essere bacato e lento (in Firefox). Quindi mi chiedo se ci sia qualcosa che sostituirà la nostra sceneggiatura.

Fondamentalmente per cosa lo utilizziamo: Gli utenti aggiungono, modificano, modificano gli elementi di quell'array e talvolta desiderano annullare/ripetere le modifiche. Al momento limitiamo la quantità di stati a 30 (potrebbe non essere la quantità ottimale).

Qualsiasi pensiero/collegamento è apprezzato!

risposta

12

Ho implementato un mixin "Memento" che tiene traccia delle modifiche delle proprietà definite nell'array mementoProperties. Supporta proprietà normali e array proprietà.

L'idea di base è la seguente: quando il mixin viene inizializzato, si registra come osservatore per le modifiche delle proprietà. Una modifica di proprietà aggiunge un nuovo elemento alla matrice memento che rappresenta la cronologia delle modifiche apportate. Il richiamo di undo imposta la proprietà sullo stato prima che la modifica sia stata apportata. redo reimposta il valore.

Il mixin è ospitato su GitHub a ember-memento. Può essere usato come segue, vedi 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 soluzione in sé è impressionante, però, perché brace non ha qualcosa di simile updateProperties invece di setProperties, non posso fare più modifiche all'oggetto e non innescare il multiplo osservatori volte. Anche se la soluzione funziona come previsto! Molte grazie! – Ignas

+1

Ho aggiornato il mixin e aggiunto un metodo 'updateProperties' che aggiunge solo 1 elemento della cronologia per più modifiche ai valori. Se hai ulteriori suggerimenti, ti preghiamo di aprire un problema nel repository. Saluti! – pangratz

+3

Ho creato un'implementazione simile semplicemente più semplice della tua. La mia implementazione è per la storia globale non solo per un oggetto. Dai un'occhiata a https://github.com/ignasbernotas/ember-history/ :) – Ignas