2010-11-30 10 views
0

ゲーム用のインターフェイスを構築しています。アクションスクリプト3 - スパークとカスタムコンポーネント間のイベント

インターフェイスには、画面の下部にタブ付きのメニューがあり、各タブにはオブジェクト(ノードと呼ばれる)のさまざまな側面が表示されます。

これらの部分の1つをクリックすると、その部分にフォーカスが当てられ、サブノードと親ノードを含むXMLの詳細がダウンロードされ、それに応じてタブ表示が更新されます。 dは起こるのが好きです。

我々が持っているもの:

MainInterface.mxml

<s:Application... 
<fx:Script> 
    <![CDATA[ 
    public var currentNode:Node = new Node(); 

    protected function selectNodeHandler(event:Event):void 
     { 
     loader = new URLLoader(new URLRequest(ourWebSite + event.target.id + ".xml")) 
     //the xmlDownloaded function below is what changes the contents of currentNode 
     loader.addEventListener(Event.COMPLETE, xmlDownloaded); 
... 
<s:SkinnableContainer id="dashBoard".. 
    <mx:TabNavigator... 
    <s:NavigatorContent... 
     <s:SkinnableDataContainer ... 
     dataProvider="{currentNode.children}" 
     itemRenderer="renderers.NodeRenderer"> 

Node.as(valueObjects.Node)

... 
    [Bindable] public var id:String; 
    [Bindable] public var name:String; 
    [Bindable] public var children:ArrayCollection = new ArrayCollection(); 
    [Bindable] public var parents:ArrayCollection = new ArrayCollection(); 
... 

NodeRenderer.mxml(renderers.NodeRenderer)

<s:ItemRenderer ... click="nodeRenderer_clickHandler(event)"> 
<fx:Script> 
    <![CDATA[ 
    protected function nodeRenderer_clickHandler(event:MouseEvent):void 
    { 
     var eventObject:Event = new Event ("nodeSelected"); 
     dispatchEvent(eventObject); 
    } 
... 
<s:Label text = "{data.name}"/> 

トライd "selectNode"のイベントリスナーをdashBoardに追加しました。上記のSkinnableContainerは、取りたいと思われませんでした。これは、dashBoardがスパークコンポーネントから来ており、 "selectNode"のディスパッチャが独自のカスタムコンポーネントで動作しているためだと思われますが、わからなかった...どんな場合でも、コードアシストはそれを手で書き込んでください。

FlashBuilder 4のデバッガでイベントを受け取る方法がわからないので、問題がどこで発生しているかを調べることができません。基本的に、誰かがchildRendererによって表示された子ノードまたは親ノードのラベルをクリックすると、クリックされたノードに固有のURLを持つURLRequestがWebサイトに送信されます。次に、URLLoaderがxmlDownloadedがローダーによって呼び出されたときにpublic変数 'c​​urrentNode'を更新するリターンをリスンする必要があります。

あなたはクリックイベントが送出される方法を明確にすることができれば、それは、その後のURLRequestを送信し、XMLデータを返すようにするために待機しているURLLoaderクラスは、それが私たちの問題を解決するべき場所のために、何を聞いてしなければなりません。あるいは、私たちがやろうとしていることをやっているより良い(もっと従来の)方法があれば、それは助けになるでしょう。私たちはactionscriptとflexに比較的新しいものです。

答えて

1
protected function selectNodeHandler(url:String):void 
    { 
    loader = new URLLoader(new URLRequest(url)); 

    //consider identifying the loader, for instance 
    loader.name = url; // you could also pass a second parameter 
    //to the function and assign it to the name property of the loader. 

    //the xmlDownloaded function below is what changes the contents of currentNode 
    loader.addEventListener(Event.COMPLETE, xmlDownloaded); 
    } 


protected function nodeRenderer_clickHandler(event:MouseEvent):void 
{ 
    var url:String = ourWebSite + event.currentTarget.id + ".xml"; 
    selectNodeHandler(url); 
} 

protected function xmlDownloaded(event:Event):void 
{ 
     //identify the target here with the name property 
     var id:String = event.target.name; 
} 
+0

ありがとうございます!私たちは変更しなければならなかった selectNodeHandler(url); 〜 FlexGlobals.topLevelApplication.selectNodeHandler(url); NodeRendererファイルが関数にアクセスできなかったが、それ以外の場合は関数にアクセスできなかったためです。 –

+0

また、イベントコールをメソッド呼び出しよりも優れたカプセル化のために提供していたような印象を受けたのは印象に残っていました。イベントの柔軟性が十分でないか、どこでも使用できるほどの時間がかかります? –

+0

私は答えを書いているときにselectNodeHandlerメソッドのスコープをチェックしませんでしたが、メソッドが呼び出しオブジェクトのスコープ内になければ正しいと思いますので、今のように直接メソッドを呼び出すのではなく、イベントを使うべきです。これを処理するにはいくつかの方法がありますが、トップレベルまでMouseEventのバブリングを聞くことができ、そこからselectNodeHandlerメソッドを呼び出すことができます。あるいは、url&loader idをパラメータとするカスタムイベントを送出することもできます。 – PatrickS

関連する問題