2011-05-12 76 views
0

如何正確實現自定義事件?我認爲以下應該工作,但我從來沒有收到CustomEvent.READY中的主力機型如何實現自定義事件?

package mvc 
{ 
    import flash.events.Event; 
    public dynamic class CustomEvent extends Event 
    { 
     public static const MY_EVENT:String = "myEvent"; 
     public static const READY:String = "ready"; 

    public function CustomEvent(type:String) 
    { 
     super(type); 
    } 
} 
} 

在延伸AbstractModel的Model.as延伸此事件

private function initWorld():void { 
     _worldModel = new WorldModel(); 
     _worldModel.addEventListener(CustomEvent.READY, update); 
} 

然後在一個延伸WorldModel.as AbstractModel擴展了EventDispatcher,我分派了一個事件,但是更新從不被調用。爲什麼?

dispatchEvent(new Event(CustomEvent.READY)); 

回答

1
_worldModel.dispatchEvent(new CustomEvent(CustomEvent.READY)); 

你必須實例化一個自定義事件,而不是一個事件。巨大差距。

你也可以用你的自定義事件傳遞其他參數與調度的事件,如果你使用你的自定義事件的,這將被證明出奇得心應手嚴重

package com.b99.events 
{ 
    import flash.events.Event; 

    /** 
    * ... 
    * @author bosworth99 
    */ 
    public class AppEvents extends Event 
    { 
     public static const APP_READY  :String = "application ready"; 
     public static const XML_LOADED  :String = "XML has loaded"; 
     public static const CHANGE_COMPLETE :String = "state change complete"; 
     public static const PAGE_ADDED  :String = "page content added"; 
     public static const PAGE_REMOVED :String = "page content removed"; 
     public static const LIBRARY_LOADED :String = "external library loaded"; 
     public static const IMAGE_LOADED :String = "external image loaded"; 
     public static const LOAD_ERROR  :String = "external load failed"; 

     public var arg:*; 

     public function AppEvents(type:String, bubbles:Boolean = false, cancelable:Boolean = false, ...a:*) 
     { 
      super(type, bubbles, cancelable); 
      arg = a; 
     } 

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

    } 
} 

然後,您可以通過任意數量的參數一起一個接收函數:

this.dispatchEvent(new AppEvents(AppEvents.LIBRARY_LOADED, false , false, _name, _library, _names)); 

並在接收函數中以數組的形式訪問它們。

private function onLibraryLoad(e:AppEvents):void 
     { 
      _digestExternalLib.removeEventListener(AppEvents.LIBRARY_LOADED, onLibraryLoad); 

      var currentIndex:int = AppData.navLocations.indexOf(e.arg[0], 0); 

      AppData.libraries.push(e.arg[0]); 
      AppData.libraryCon.push(e.arg[1]); 
      AppData.libraryNames.push(e.arg[2]); 

     } 

我猛拉這從運作項目......但你應該能夠收集重要的位...... 祝你好運!

+0

非常感謝,看起來確實非常有用!結果發現我的事件在聽者發起之前就被解僱了。真的有點傻。 – davivid 2011-05-12 14:41:57

+0

在這種情況下,不需要分派CustomEvent類的實例。 – Ohas 2011-05-12 14:43:25

+0

@Omer =你完全正確。由於OP的customEvent沒有增加額外的功能,因此靜態常量是所有必需的(並且可以在任何地方保存)。然而,在這種情況下,問題是「如何實現自定義事件」,而不是「如何使用靜態常量」...... – Bosworth99 2011-05-12 16:44:28

0

我真的沒有看到任何錯誤的代碼。只是爲了測試,嘗試initWorld的末尾添加這一說法()方法:

_worldModel.dispatchEvent(new Event(CustomEvent.READY)); 

如果你的update()方法被調用時,這將表明,現有的dispatchEvent()方法不會被調用。

+0

mmm添加該測試按預期工作。我的dispatchEvent方法被調用,因爲我有任何一方的痕跡,很奇怪。 – davivid 2011-05-12 14:26:59

+0

但是,您並沒有真正使用您的自定義事件 - 只有在自定義事件類中找到的靜態常量。 – Bosworth99 2011-05-12 14:31:41

+0

愚蠢的錯誤,我正在啓動WorldModel,它是在創建偵聽器之前觸發事件的... – davivid 2011-05-12 14:43:05