2012-05-11 9 views
12

Edit: Ich habe meine eigene Implementierung gemacht, die auf ist GitHubEmberJS Geschichte/Undo

Ich frage mich, gibt es eine integrierte Funktion in Ember, die Zustände von Objekten/Arrays speichern können? In unserer App haben wir unsere eigene Undo/History-Implementierung für einen bestimmten Ember.ArrayController erstellt, aber es scheint fehlerhaft und langsam zu sein (in Firefox). Ich frage mich also, ob es etwas gibt, das unser Skript ersetzen könnte.

Im Grunde verwenden wir es für: Benutzer hinzufügen, bearbeiten, ändern Elemente in diesem Array und manchmal möchten sie ihre Änderungen rückgängig machen/wiederholen. Im Moment begrenzen wir die Anzahl der Zustände auf 30 (ist möglicherweise nicht die optimale Menge).

Alle Gedanken/Links sind willkommen!

Antwort

12

Ich habe ein Mixin "Memento" implementiert, das Änderungen der Eigenschaften verfolgt, die in mementoProperties Array definiert sind. Es unterstützt normale Eigenschaften sowie Array Eigenschaften.

Die Grundidee ist folgende: Wenn das Mixin initialisiert wird, registriert es sich selbst als Beobachter für Eigenschaftsänderungen. Eine Eigenschaftsänderung fügt dem Array memento ein neues Element hinzu, das den Verlauf der vorgenommenen Änderungen darstellt. Durch das Aufrufen von undo wird die Eigenschaft in den Status vor der Änderung versetzt. redo setzt den Wert zurück.

Die mixin wird auf GitHub unter ember-memento gehostet. Es kann wie folgt verwendet werden, siehe 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

Die Lösung selbst ist genial, aber weil ember etwas wie updateProperties nicht statt setProperties habe ich nicht mehrere Änderungen an dem Objekt machen können und nicht lösen die Beobachter mehrere mal. Obwohl Ihre Lösung wie erwartet funktioniert! Danke vielmals! – Ignas

+1

Ich habe das Mixin aktualisiert und eine 'updateProperties' Methode hinzugefügt, die nur ein historisches Element für mehrere Wertänderungen hinzufügt. Wenn Sie weitere Vorschläge haben, öffnen Sie bitte ein Problem im Repo. Prost! – pangratz

+3

Ich habe eine ähnliche Implementierung einfach viel einfacher als Ihre erstellt. Meine Implementierung ist für die globale Geschichte nicht nur für ein Objekt. Schau es dir an https://github.com/ignasbernotas/ember-history/ :) – Ignas