2011-08-18 132 views
2

我想爲多個事件設置一個事件監聽器,具體取決於我想要分別處理它們的事件類型
從單個監聽器處理多個事件

類似的東西來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組件,它得到基於
'type'動態創建。

另外哪種類型的事件應該從組件派發事件?例如:Event.SELECT

更確切地說,上述基本上是工具欄所必需的。
當用戶選擇一個工具時,他會顯示一個工具的選項,當他選擇選項時,
工具應該將它們應用於視圖上的對象。

有沒有更好的方法來做同樣的事情?

回答

4

這就是我的理解:

你有不同的工具。每個工具都有一個選項列表。您單擊一個選項,並且單個事件處理程序應根據選項執行一些操作。

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

UPDATE - 如何設置選項值的列表中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]; 
    } 
} 
+0

爲answer..yes THX我想出了非常相似的東西..如果選項是事件的一部分嗎?我對不同的工具有不同的選擇。 – Amitd

+0

由於您的'OptionEvent'氣泡,您可以輕鬆地檢索'toolOptionSelectedHandler'內的實際選項:'var option:MyOption = event.target'。 –

+0

可以將選項放入事件本身嗎?因爲我的版本的optionEvent是非冒泡的..在事件內部聲明瞭一個字段'options'(keyvalue pair)..每個工具選項都可以有自己的type VO? – Amitd

2

您也可以嘗試這樣的事: http://blog.iconara.net/2008/03/30/separating-event-handling-from-event-filtering/

和我做了一個解決方案,我」通過使用具有單獨的determinResponsibility和meetResponsibility方法的鏈接來使用責任鏈,這對於創建鏈接時存儲特定事件數據來說更舒適一些。如果我們發現該事件與傳入鏈中的事件之間存在匹配,那麼我們稱之爲meetResponsibility。否則,我們稱之爲鏈中的下一個鏈接。

更多關於COR,請http://www.as3dp.com/2008/01/14/actionscript-30-chain-of-responsibility-design-pattern-decoupling-request-and-request-handler/