3
我的web應用程序有一個撤銷/重做的概念。我正在考慮如何最好地實施它。使用大量閉包效率不高嗎?
我目前的方法是有一個數組數組,其中每個數組是一堆回調來調用恢復該版本。例如。一個標籤,以恢復其舊的價值將是:
var undoer = {
at = 0,
stack = [[]],
push = function(do,undo) {
if(undoer.at > 0) {
undoer.splice(0,undoer.at,[]);
undoer.at = 0;
}
undoer.stack[0].push([do,undo]);
},
commit = function() {
if(undoer.at == 0 && undoer.stack[0])
stack.unshift([]);
},
rollback = function() {
if(undoer.at == 0 && undoer.stack[0])
while(var func: stack[0].pop())
func[1]();
},
undo = function() {
// move the at index back, call all the undos
...
redo = function() {
// move the at index forward, call al dos
...
};
function Label(text) {
var _text = text,
label = {
get: function() { return _text; },
set: function(text) {
var old = text;
_text = text;
undoer.push(
function() { _text = text; }, // do
function() { _text = old; } // undo
);
},
...
};
return label;
}
(在這個僞道歉錯別字與遺漏)
這是存儲撤消和重做一個封閉變化所需的狀態變化。
想象一下現在成千上萬的編輯。使用可變參數函數並將arguments
的副本放入撤消堆棧會更有效嗎?
是否有更好的方法來做撤銷/重做?