我的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
的副本放入撤消堆栈会更节省内存吗?
还有更好的方法可以撤消/重做吗?
答案 0 :(得分:1)
是的。
但它们更容易阅读/使用/维护。没有“正确”的答案,只是成本/收益分析。只是确保你不会过于夸张。