2012-11-17 61 views
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的副本放入撤消堆棧會更有效嗎?

是否有更好的方法來做撤銷/重做?

回答

1

是的。

但它們更易於閱讀/使用/維護。沒有「正確」的答案,只是成本/效益分析。只要確保你不會太深入。

相關問題