在flex中实现撤消重做

时间:2013-01-31 09:59:00

标签: actionscript-3 flex flex4.5 flex4.6

如何在flex 4中实现撤消重做操作以维护历史记录? 我正在使用flex UIComponent和DisplayObjects来创建和编辑图表,但是 在flex中,无法直接处理用户操作历史记录。 有任何想法实现这一目标吗?

3 个答案:

答案 0 :(得分:5)

您可以使用执行和撤消方法为所有操作实施Command Pattern,并将它们排队。

所以当用户想要做某事时 - 让我们说创建一个AddFiveToTotal类并执行:

public method execute():void{
     totalModel.add( 5 );
}

然后该类将存储在FIFO队列中。

如果用户需要撤销该命令,则会弹出该命令并调用撤消功能:

public method undo():void{
     totalModel.subtract( 5 );
}

用于可重做性,不要弹出,只是迭代队列

另请参阅Memento Pattern

如果您正在使用任何当前流行的MVC(S)框架,您将无疑会找到某个已创建的工具

答案 1 :(得分:0)

你可以在memento pattern的帮助下实现目标。很难跟踪所有属性,你可以使用什么属性来进行撤销/重做操作。

Memento Design pattern

Memento pattern

使用源代码http://www.flairpy.com/mementoPattern/MementoSample.html

的演示示例

答案 2 :(得分:0)

有几种方法可以解决此问题。首先是将整个画布的状态保持在Vector(我的意思是监听用户可以在舞台上执行的所有操作并在更改后保存状态)然后保存当前状态的索引,这样你就可以穿过你的Vector并将所需的状态放在舞台上。这是解决撤销/重做功能的最简单方法,但要注意你必须经常制作对象克隆,如果要处理大量对象或大量撤消,这将成为内存耗尽/重做操作。

第二种方法是仅保留该向量中的更改,以便您不必创建和克隆大量对象,而只保存Vector中包含所有属性的一个对象已经改变了,他们的最后价值观。这样可以得到这样的结果:

private var mHistory:Vector.<Object> = new Vector.<Object>();
private var mCurrentIndex:int = -1;

public function storeState(state:Object)
{
   mHistory.push(state);
   mCurrentIndex++;
}     

public function undo():void
{
   if(mCurrentIndex < 1)
       return;

   mCurrentIndex--;

   //here you could test for values that could have changed
   var item:DisplayObject = this.getChildByName(mHistory[mCurrentIndex].name);
   if(mHistory[mCurrentIndex].x != undefined)
       item.x = mHistory[mCurrentIndex].x;
   // etc. you get the point. Note that this is only comfortable if only several things can change
}

storeState函数的调用将是这样的:

var state:Object = { name:DisplayObjectName, x:120, y:20 };
storeState(state);

同样,如果你想录制它们,你必须听取所有的动作和变化。