从单个侦听器处理多个事件

时间:2011-08-18 12:21:14

标签: actionscript-3 flex4 event-handling

我希望为多个事件提供单个事件监听器,具体取决于具体情况 我希望单独处理它们的事件类型。

类似于Swiz framework的内容,请参阅:“从单一方法处理多个事件”

我有一段像

这样的代码
     var toolOptions:UIComponent=ToolOptions.createToolOptions(type);
            if (options != null)
            {
                options.addEventListener(Event.SELECT,toolOptionSelectedHandler);
                someViewComponent.addOptions(toolOptions);
            }

   // handle depending on event type
    private function toolOptionSelectedHandler(event:*):void
    {
        //handle depending on type of event fired
        // type cast  event depending on type and  retrieve VO from event 
        //and send handle it..

        //SomeToolObj.handle(event.VO);    

    }

在上面 toolOptions 是一个mxml组件,它基于
动态创建 '类型'。

还应该从组件中调度哪种类型的事件?例如:Event.SELECT

更准确地说,工具栏基本上需要上述内容 当用户选择工具时,他会显示工具的选项,当他选择选项时, 工具应该将它们应用于视图上的对象。

还有更好的方法吗?

2 个答案:

答案 0 :(得分:4)

这就是我的理解:

你有不同的工具。每个工具都有一个选项列表。单击一个选项,单个事件处理程序应根据选项执行某些操作。

object on the view 1 : n tools 1 : n options

使用属性OptionEvent.SELECT创建自定义事件optionType

public class OptionEvent extends Event {
    public static const SELECT : String = "optionEvent_select";
    public var optionType : String;
    public function OptionEvent(type : String) {
        super(type, true); // bubbles
    }
}

当用户选择该选项时,请按以下方式调度事件:

var event : OptionEvent = new OptionEvent(OptionEvent.SELECT);
event.optionType = "border";
dispatchEvent(event);

像你一样听取这个事件:

var toolOptions:UIComponent=ToolOptions.createToolOptions(type);
if (options != null) {
    options.addEventListener(OptionEvent.SELECT,toolOptionSelectedHandler);
    someViewComponent.addOptions(toolOptions);
}

通过确定选项类型来区分选项类型:

private function toolOptionSelectedHandler(event : OptionEvent) : void {
     var optionType = event.optionType;
     switch (optionType) {
         case "border":
             addBorderToView();             
             break;
         case "rotation":
             rotateView();             
             break;
     }
}

更新 - 如何在OptionEvent中设置选项值列表:

public class OptionEvent extends Event {
    public static const SELECT : String = "optionEvent_select";
    public var optionType : String;
    private var _optionValues : Object;

    public function OptionEvent(type : String) {
        _optionValues = new Object();
        super(type, true); // bubbles
    }

    public function setOptionValue(property : String, value : *) : void {
        _optionValues[property] = value;
    }

    public function getOptionValue(property : String) : * {
        return _optionValues[property];
    }
}

答案 1 :(得分:2)

您可能还想尝试这样的事情: http://blog.iconara.net/2008/03/30/separating-event-handling-from-event-filtering/

并且我已经做了一个解决方案我通过使用具有单独的DetermResponsibility和meetResponsibility方法的链接来使用责任链更加舒适,其中在创建链接时存储特定事件数据。如果我们发现它与传递到链中的事件之间存在匹配,那么我们称之为meetResponsibility。否则,我们称之为链中的下一个链接。

有关COR的更多信息,请查看http://www.as3dp.com/2008/01/14/actionscript-30-chain-of-responsibility-design-pattern-decoupling-request-and-request-handler/