3

我的 webapp 有一个撤消/重做的概念。我正在考虑如何最好地实施它。

我目前的方法是拥有一个数组数组,其中每个数组都是一组回调,以调用以恢复该版本。例如,要恢复其旧值的标签将是:

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放入撤消堆栈会更节省内存吗?

有没有更好的方法来做撤销/重做?

4

1 回答 1

1

是的。

但它们更容易阅读/使用/维护。没有“正确”的答案,只有成本/收益分析。只要确保你不会递归太深。

于 2012-11-17T17:55:34.613 回答