2009-09-07 26 views
4

我有一個加載其他幾個swfs的主「父」swf。如果主SWF中發生了什麼,我需要告訴其中一個子SWF。as3 - 從父swf到子swf的dispatchEvent

這似乎很好地反過來。任何一個孩子都可以簡單地使用dispatchEvent(),並且我可以設置主要的swf來監聽事件。但是,我無法讓swf抓住父母派出的任何事件。它是如何完成的?

回答

5

好的,所以如果你已經知道了大部分,我的道歉......但它似乎是一個很常見的問題,並不是很明顯。

在由顯示列表上的對象調度的AS3事件中,可以聽到他們冒泡up顯示列表層次結構,而無需指定發起對象。 (當然假設事件的冒泡屬性設置爲true)。因此,文檔類(_root的舊概念)可以響應來自任何顯示對象的鼠標點擊,無論嵌套深度如何,在任何其他情況下 - 例如, bubbling設置爲false,廣播者不是顯示列表上的InteractiveObject,或者(與您的情況相同),監聽者低於顯示列表層次結構中的廣播者 - 廣播該事件的對象必須專門收聽:

fooInstance.addEventListener(Event.BAR, _bazFunc)
as反對
addEventListener(Event.BAR, _bazFunc)

基本上你需要將一個對父對象的引用傳遞給你的子swf,以便它可以將事件處理程序附加到它。

一種方法是通過顯示列表(一旦孩子已經加載並完全初始化)將一個事件從孩子分派給父類。父級使用此事件的event.target屬性來引用子級並在其上設置parentClass變量。這可以被用來連接監聽器:

package { 


    class ChildClass 
    { 
     private var __parentClass:ParentClass; 

     // EventID to listen for in ParentClass 
     public static const INITIALISED:String = "childInitialised"; 

     // Constructor 
     function ChildClass() 
     { 
      // Do initialising stuff, then call: 
      _onInitialised(); 
     } 

     private function _onInitialised():void 
     { 
      // Dispatch event via display hierarchy 
      // ParentClass instance listens for generic events of this type 
      // e.g. in ParentClass: 
      //  addEventListener(ChildClass.INITIALISED, _onChildInitialised); 
      //  function _onChildInitialised(event:Event):void { 
      //   event.target.parentClass = this; 
      //  } 
      // @see mutator method "set parentClass" below 
      dispatchEvent(new Event(ChildClass.INITIALISED, true); 
     } 

     public function set parentClass(value:ParentClass):void 
     { 
      __parentClass = value; 

      // Listen for the events you need to respond to 
      __parentClass.addEventListener(ParentClass.FOO, _onParentFoo, false, 0, true); 
      __parentClass.addEventListener(ParentClass.BAR, _onParentBar, false, 0, true); 
     } 

     private function _onParentFoo(event:Event):void 
     { 
      ... 
     } 
    } 
} 

調度定製ChildSWFEvent - 即,而不是使用一個類定義的常量如上 - 將會使之成爲一個更靈活的解決方案,因爲父類的實例可以偵聽一個共同的ChildSWFEvent .INITIALISED事件由具有上下文有用信息的任何子swf廣播作爲附加參數傳遞。

0

我會在每個孩子聽

Event.ADDED_TO_STAGE 

一旦被添加到舞臺上,那麼你可以參考/聽的舞臺活動。

//Child 
if(stage) _init(); //Already added 
else addEventListener(Event.ADDED_TO_STAGE, _init); //waiting to be added 

private function _init(e:Event = null):void 
{ 
    stage.addEventListener(CustomEvent.CHANGED, _onStageChanged); 
{ 

我沒有測試這一點,但只要你從舞臺調度的事件,它應該工作。

//stage 
dispatchEvent(new CustomEvent(CustomEvent.CHANGED)); 

如果您正確設置自定義事件類,則還可以傳遞信息。

1

當您在父SWF(索引)中加載子SWF(Main.swf)時。SWF),請

fldMain = BulkLoader.getLoader("Index").getContent("Main.swf") as DisplayObject; 
this.addChild(fldMain); 

(我使用BulkLoader加載任何內容)

這是一個很好的做法與調度事件要等到孩子是一個字段變量或類變量的引用加入(ADDED_TO_STAGE事件)

當我想派遣一個事件,我的孩子,我只想說:

fldMain.dispatchEvent(new CustomEvent(CustomEvent.INIT_CHILD,data)); 
+0

非常好,簡單和簡單。謝謝! – cregox

0

我做的是在孩子被添加到舞臺後,爲父母添加一個監聽器以進行更改。現在,只要您想讓孩子處理更新問題,只需從父母處發送Event.CHANGE即可。冒泡可能是真的或假的。

我認爲,如果您將孩子的聆聽者附加到舞臺上(stage.addEventListener...),則引發Event.CHANGE的任何對象都可能觸發孩子處理該事件。

package 
{ 
    import flash.display.* 
    import flash.events.* 

     public class Child extends Sprite 
     { 

      public function Child():void 
      { 
       this.addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler, false, 0, true); 
      } 

      private function addedToStageHandler(pEvent:Event):void 
      { 
       trace("CHILDADDED"); 
       this.removeEventListener(Event.ADDED_TO_STAGE, addedToStageHandler); 
       this.parent.addEventListener(Event.CHANGE, parent_changeEventHandler, false, 0, true); 
      } 

      private function parent_changeEventHandler(pEvent:Event):void 
      { 
       trace("PARENT_CHANGED"); 
      } 
     } 
} 
0

國際海事組織,幾乎不適合小孩知道或關心其父母。另一方面,父母幾乎總是知道他們的孩子的一切(因爲他們直接提到他們)。因此,在這種情況下,我只需在父類中設置/調用子類時創建一個屬性或方法即可。

這具有更好的性能優勢,因爲創建和處理事件比調用方法或設置值更昂貴。

HTH;

艾米