2012-06-15 29 views
0

我有以下自定義事件:從dispatchEvent獲取結果的Flex 3

package com.un.photoManager.events 
{ 
import flash.events.Event; 

import mx.collections.ArrayCollection; 


public class CreateAlbumFolderEvent extends Event 
{ 
    // when creating an album, we need to know which albumfolder to put it in, 0 is the default group; 
    public var albumFolderID:int = 0; 
    public var name:String; 

    public function CreateAlbumFolderEvent(type:String, name:String, albumFolderID:int = 0, cancelable:Boolean = false) 
    { 
     super(type, true, cancelable); 
     this.name = name; 
     this.albumFolderID = albumFolderID; 

    } 

} 
} 

的事件會得到從彈出使用下面的代碼名爲:

protected function handleCreate():void 
     { 
      var event:CreateAlbumFolderEvent; 
      var selectedItemType:String; 

      if (folderAlbum == CREATE_ALBUM) 
      { 
       event = new CreateAlbumFolderEvent(EventConstants.CREATE_ALBUM, newAlbumFolder.text, selectedAlbumFolderID); 
       selectedItemType = "Album"; 
      } 
      else 
      { 
       event = new CreateAlbumFolderEvent(EventConstants.CREATE_ALBUM_FOLDER, newAlbumFolder.text); 
       selectedItemType = "Folder"; 
      } 
      dispatchEvent(event); 
      FolderBrowse.lastSelectedItemType = selectedItemType; 
      PopUpManager.removePopUp(this); 
     } 

我所試圖做的是捕捉回傳的迴應。這是查爾斯顯示答覆的屏幕截圖。結果值是我期望在dispatchEvent(event);執行後可以使用的值。

Screenshot from Charles

我一直在這幾個小時看博客&論壇帖子,並一直沒能得到解決工作。理想情況下,代碼示例會很好,但現在有任何幫助,將不勝感激。

回答

0

您需要覆蓋的Event.clone()方法,在你的子類。 clone()方法通過設置克隆中的type屬性和任何新屬性來返回事件對象的克隆副本。通常,您定義clone()方法以返回使用new運算符創建的事件實例。

package sample 
{ 
    import flash.events.Event; 
    import mx.collections.ArrayCollection; 

    public class CustomEvent extends Event 
    { 

     public static var DATA_LOADED:String = "dataLoaded"; 

     private var _data:ArrayCollection; 

     public function CustomEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false, data:ArrayCollection=null) 
     { 
      super(type, bubbles, cancelable); 
      _data = data; 
     } 

     override public function clone():Event 
     { 
      return new CustomEvent(type, bubbles, cancelable, data); 
     } 

     public function get data():ArrayCollection 
     { 
      return _data; 
     } 
    } 
} 
0

er

更重要的問題可能是您如何傾聽該事件?由於您是從彈出窗口調度事件,因此我假定您正試圖在彈出窗口範圍之外觸發​​此事件。

一般情況下,事件的工作就像你所期望的,一個變化:從彈出窗口 事件不會繼承鏈向下行進到

重要的是要考慮以下幾點是非常重要的主應用程序根。

相反,從彈出窗口調度的事件終止於 窗口根。這是因爲彈出式窗口管理器是 彈出窗口的父窗口。

其結果是,在彈出的啓動事件不冒泡到主 應用程序頁面,這是在 主要應用的任何對象的最終母公司。

Flex應用程序中的彈出窗口不是應用程序容器的子窗口,而是 而不是SystemManger的子窗口。

這個意思,如果你只是發送一個事件,它將只會達到系統管理器,任何嘗試在應用層次結構中聽低的任何東西都不會收到這個。

有許多解決問題的對策和變化取決於你的架構(首選framewords(香菜,Robotlegs的)),但現在,如果你只需要添加一個監聽器Application.application.systemManager您應該接收事件:

Application.application.systemManager.addEventListener(EventConstants.CREATE_ALBUM_FOLDER,[Your HANDLER]);

您可能還需要在分派事件時發出BUBBLE事件。

然而,這不是處理來自彈出窗口事件的理想解決方案,您可能需要考慮將模型注入彈出窗口並讓它們發佈消息。

希望幫助