【问题标题】:AS3 How to determine the sequence of eventsAS3 如何确定事件的顺序
【发布时间】:2011-12-01 03:34:32
【问题描述】:

我正在使用 flex-4-tree (https://github.com/wasbridge/flex-4-tree) 在手机 AIR 应用中。

树类:

public class Tree extends List
{
    ...
    dataSource.addEventListener(TreeEvent.NODE_EXPANDED, nodeExpandedHandler);
    dataSource.addEventListener(TreeEvent.NODE_COLLAPSED, nodeCollapsedHandler);
    ...
}

应用程序的主屏幕上有一个菜单。 如果用户选择了一个菜单项,就会采取适当的行动, 但是如果用户通过选择扩展器图标来展开/折叠菜单项, 菜单项被展开/折叠。

目前列表更改事件是在 flex-4-tree 展开/折叠事件。

我需要先收到 flex-4-tree 展开/折叠事件 列表更改事件。

任何帮助将不胜感激。

【问题讨论】:

  • 事件发生时发生,您不能更改它们的顺序。这就好比说我希望我的水在加热之前沸腾。
  • @Laurent 如果您可以控制源代码,则可以轻松更改调度事件的顺序;尽管在这种情况下,这样的工作听起来并不容易,因为他正在处理使用 Flex 框架代码。我会考虑一种不同的方式来在相关事件处理程序中对您的操作进行排队。
  • @www.Flextras.com,他的问题确实是如何更改第三方库的事件顺序,而这无法做到(只是没有意义)。他确实可以破解源代码,但他可能会在此过程中产生许多其他问题。很可能他只需要在第一个事件处理程序中设置一些布尔值,然后在第二个事件处理程序中检查这个布尔值并在它打开时做一些事情。
  • 不管怎样,依赖Event执行顺序是邪恶的做法。
  • 这个的最终目标是什么?有时我们想到的第一种方法(可能是幼稚的,而不是邪恶的)并不是行之有效的方法。

标签: actionscript-3 apache-flex events list


【解决方案1】:

在您的处理程序中为 ListChangeEvent 设置一个计时器,该计时器将任何操作延迟十分之一秒。然后,如果您在计时器结束之前扩展/收缩事件,您可以取消更改事件的操作。像这样的:

private var _expandEventOccurred:Boolean = false;

private function handleListChange(evt:Event):void {

    var timer:Timer = new Timer(100,1);  //100ms = 0.1s
    timer.addEventListener(TimerEvent.TIMER_COMPLETE, handleListChangeTimerEvent);
    timer.start();

}

private function handleExpandContract(evt:Event):void {

    _expandEventOccured = true;

    //perform whatever other actions you need for the expand/contract event

}

private function handleListChangeTimerEvent(evt:Event):void {

    if(_expandEventOccured) {
        _expandEventOccured = false;
        return;
    }

    _expandEventOccured = false;  //needed here as well

    //perform whatever other actions you need for the list change event 

}

不是世界上最干净的东西,但应该可以解决问题。希望对您有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    • 2022-12-06
    • 1970-01-01
    • 2019-03-07
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多