【问题标题】:Handling Multiple Events from a Single Listener处理来自单个侦听器的多个事件
【发布时间】:2011-08-18 12:21:13
【问题描述】:

我想为多个事件设置一个事件侦听器,具体取决于
我想单独处理的事件类型。

类似于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

更准确地说,上述内容基本上是工具栏所必需的。
当用户选择一个工具时,他会看到一个工具的选项,当他选择选项时,
工具应将它们应用于视图上的对象。

有没有更好的方法来做同样的事情?

【问题讨论】:

    标签: actionscript-3 flex4 event-handling


    【解决方案1】:

    这就是我的理解:

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

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

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

    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];
        }
    }
    

    【讨论】:

    • 谢谢回答..是的,我想出了一些非常相似的东西..选项也应该成为事件的一部分吗?我对不同的工具有不同的选择。
    • 由于您的OptionEvent 冒泡,您可以轻松检索toolOptionSelectedHandler 中的实际选项:var option : MyOption = event.target
    • 可以将选项放在事件本身中吗?因为我的 optionEvent 版本是不冒泡的.. 在事件中声明了另一个字段“选项”(键值对)。每个工具选项可以有自己的类型化 VO 吗??
    • 我实际上不知道您的选择过程是如何构建的。显然,获取单个工具的所有(或至少所有选定的)选项列表的重要性。我猜你有不同的选项来调整,然后每个工具都有一个提交按钮。现在您想知道提交了哪些选项值。有不同的方式来传递这些值。 1 - 让工具 (event.currentTarget) 返回当前选项值的列表。 2 - 设置事件的正确值。第二件事我将在我的答案中提出。
    • 再次感谢 :) 是的,我现在使用上面的.. options = {"key1":value1,...,"keyn":valuen}
    【解决方案2】:

    您可能还想尝试以下方法: http://blog.iconara.net/2008/03/30/separating-event-handling-from-event-filtering/

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多