2011-06-07 24 views
1

我有一棵樹,childs dispaching事件,如果我在TitleWindow之外運行該對象 - 一切工作正常,但如果我將它封裝在TitleWindow內,就像下面的源代碼一樣 - 事件不再是系統寬泛的。TitleWindow中的Flex dispached事件不是系統範圍的?

<?xml version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       xmlns:mx="library://ns.adobe.com/flex/mx" 
       xmlns:sparkTree="com.sparkTree.*" 
       creationComplete="init()"> 
    <fx:Script> 
     <![CDATA[ 
      import mx.controls.Alert; 
      import mx.managers.PopUpManager; 

      private function init():void 
      { 
       PopUpManager.addPopUp(xWin, this); 
       this.addEventListener(MyEvent.REQUEST_FORWARD, function(e : MyEvent):void{ Alert.show(":P") }); 
      } 

     ]]> 
    </fx:Script> 

    <s:TitleWindow id="xWin" > 

     <s:HGroup width="100%" height="100%"> 
      <sparkTree:Tree labelField="label" 
        dataProvider="{dataProviderXML}" 
        width="300" height="500" 
        textRollOverColor="yellow" 
        textSelectedColor="0xFFFFFF" 
        itemRenderer="com.sparkTree.XItemRenderer"> 

       <sparkTree:layout> 
        <s:VerticalLayout gap="0" variableRowHeight="true"/> 
       </sparkTree:layout> 
      </sparkTree:Tree> 
     </s:HGroup> 
    </s:TitleWindow> 
</s:Application> 

回答

3

更改

this.addEventListener(MyEvent.REQUEST_FORWARD, function(e : MyEvent):void{ Alert.show(":P") }); 

xWin.addEventListener(MyEvent.REQUEST_FORWARD, function(e : MyEvent):void{ Alert.show(":P") }); 

或者,也許你正在使用事件冒泡?

我不知道你的代碼的詳細信息,看看它是非常有問題的,但是這個代碼工作正常:

<?xml version="1.0" encoding="utf-8"?> 
<s:Application creationComplete="init()" xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:s="library://ns.adobe.com/flex/spark"> 
    <fx:Script> 
    <![CDATA[ 
     import mx.controls.Alert; 
     import mx.managers.PopUpManager; 

     protected function init():void 
     { 
      PopUpManager.addPopUp(xWin, this); 
      systemManager.addEventListener(MyEvent.REQUEST_FORWARD, function(e:MyEvent):void 
      { 
       Alert.show(":P") 
      }); 
     } 
    ]]> 
    </fx:Script> 
    <fx:Declarations> 
     <s:TitleWindow id="xWin"> 
      <s:Button click="xWin.dispatchEvent(new MyEvent(MyEvent.REQUEST_FORWARD))" horizontalCenter="0" 
       verticalCenter="0" /> 
     </s:TitleWindow> 
    </fx:Declarations> 
</s:Application> 

其中MyEvent是:

package 
{ 
import flash.events.Event; 

public class MyEvent extends Event 
{ 
    public static const REQUEST_FORWARD:String = "requestForward"; 

    public function MyEvent(type:String) 
    { 
     super(type, true, false); 
    } 
} 
} 
約我

但是我個人建議改變你所有的代碼:)

首先,我強烈建議你在一個單獨的組件中提取你的窗口(你應該一直這樣做,只爲原型SE系列組件):

<?xml version="1.0" encoding="utf-8"?> 
<s:TitleWindow xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/mx"> 
    <fx:Metadata> 
     [Event(name="requestForward", type="MyEvent")] 
    </fx:Metadata> 
    <s:Button click="dispatchEvent(new MyEvent(MyEvent.REQUEST_FORWARD))" horizontalCenter="0" 
     verticalCenter="0" /> 
</s:TitleWindow> 

二,不使用冒泡事件,而無需特別外組件:

package 
{ 
import flash.events.Event; 

public class MyEvent extends Event 
{ 
    public static const REQUEST_FORWARD:String = "requestForward"; 

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

第三,儘量不要使用內部函數,並創建單獨的方法。它更具可讀性,更容易取消訂閱。因此,我們的最終應用:

<?xml version="1.0" encoding="utf-8"?> 
<s:Application creationComplete="init()" xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:s="library://ns.adobe.com/flex/spark"> 
    <fx:Script> 
    <![CDATA[ 
     import mx.controls.Alert; 
     import mx.managers.PopUpManager; 

     protected function init():void 
     { 
      var win:MyWindow = MyWindow(PopUpManager.createPopUp(this, MyWindow)); 
      win.addEventListener(MyEvent.REQUEST_FORWARD, win_requestForwardHandler); 
     } 

     private function win_requestForwardHandler(event:MyEvent):void 
     { 
      Alert.show(":P"); 
      var win:MyWindow = MyWindow(event.currentTarget); 
      win.removeEventListener(MyEvent.REQUEST_FORWARD, win_requestForwardHandler); 
     } 
    ]]> 
    </fx:Script> 
</s:Application> 
+0

是的,我使用的事件bubling(對不起,我錯過了將其添加)...的MyEvent情況如下:\t \t公共職能MyEvent(類型:字符串) \t \t { \t \t \t super(type,true,false); \t \t} – 2011-06-07 08:16:49

+0

1.你的情況冒泡有什麼好處?不要使用它。 2.如果你不能沒有它,使用'systemManager'來訂閱。 – Constantiner 2011-06-07 08:19:50

+0

我不知道,我打賭bubling將提供更廣泛的事件使用。如何使用systemManager訂閱? – 2011-06-07 08:25:56