[编辑] 这里的主要问题松散地翻译为“Flex 是多线程的”吗?从那以后我发现它不是,所以我不会在操作中途让数据神秘地改变。下面的代码有效,但让事情变得尴尬和混乱。我最终通过架构更改解决了这个问题,消除了抑制事件的需要。正如第一位评论者所建议的那样。
通过改变监听事件的方式和明确地执行某些操作而不是通过事件来消除无限循环。
使用命令模式更容易整理事件。
基本上,如果您遇到此页面,请不要使用下面的代码![/编辑]
我正在使用简单、轻量级的 MVC 模式构建一些 Flex 应用程序。模型扩展或封装调度程序并在更新时触发事件。我坚持使用 Flex 3.5。
在某些情况下,我会想要抑制这些事件以避免无限循环或帮助将多个操作整理到单个事件中。
我第一次尝试的解决方案不会用不必要和令人困惑的代码乱扔模型是这样的:
private var _suppressEvents:Boolean = false;
public function suppressEvents(callback:Function):void
{
// In case of error, ensure the suppression is turned off, then re-throw
var err:Error = null;
_suppressEvents = true;
try
{
callback();
}
catch(e:Error)
{
err = e;
}
_suppressEvents = false;
if (err)
{
throw (err);
}
}
public function dispatch(type:String, data:*):void
{
// Suppress if called from a suppress callback.
if (!_suppressEvents)
{
_dispatcher.dispatchEvent(new DataEvent(type, data));
}
}
显然,我使用包含我希望运行的模型代码的函数调用“suppressEvents”。
我的问题:
1:我是否有可能使用这种技术意外丢失事件?
2:在确保我不会在通话后意外进入抑制状态时,我是否需要考虑任何其他错误边缘情况?
3:有没有我想念的更清洁的方式?
谢谢!