2010-12-23 11 views
0

アドビドキュメントの状態:関係なく、MXMLコンポーネント内のすべてのタグのフレックス:モジュール内のコンポーネントID、ネストされたviewstacksなどを参照

IDは、深く、彼らはネストされたコンポーネントのパブリック変数を生成する方法定義されている。その結果、すべてのidプロパティはドキュメント内で一意でなければなりません。つまり、コンポーネントインスタンスのIDを指定した場合、関数、外部クラスファイル、ActionScriptファイルのインポート、インラインスクリプトなど、アプリケーションのどこからでもそのコンポーネントにアクセスできます。

アプリケーションがすべて1 MXML内に含まれている場合は問題あり

、私は与えられたモジュール内のモジュール内のコンポーネントのIDを参照する問題を抱えて、その後、ViewStacks /ナビゲーションコンテナ内部のです。例えば

私はFlexGlobals.topLevelApplication.myModuleでモジュールを参照することができる場合、私は次のようにmyModulePanelと呼ばれるパネルを参照することはできないでしょうか?

FlexGlobals.topLevelApplication.myModule.myModulePanel 

または、タイトル、幅等のような特性のために少なくとも

FlexGlobals.topLevelApplication.myModule.getChildByName(myModulePanel) 

コンポーネントIDはパブリック変数(ドキュメントによる)なので、コンポーネントのプロパティにアクセスするために、一連の.getChildByName()関数をチェーンしてコンポーネント/コンテナレベルにドリルダウンする必要はないと思いました私が上で試した方法は動作していないようです。

この場合、ViewStacksなどの子にアクセスするために、コンポーネント参照の長いチェーンを形成する必要があります。この階層を検査するにはどうすればよいでしょうか?

ご意見をいただければ幸いです。

ありがとうございました。

答えて

0

モジュールの外に呼び出される必要があるメソッドを定義する各モジュール(またはすべてのモジュールがサブスクライブする1つのメインインターフェイス)のインターフェイスを作成する必要があります。こうすることで、モジュール自体ではなく、インタフェースと対話できますが、インタフェースメソッドはモジュールクラスとメインアプリケーションを仲介します。

ModuleManagerによってロードされたIModuleInfoインターフェイスを使用すると、これに役立ちます。詳細は、this pageを参照してください。

<?xml version="1.0"?> 
<!-- modules/ModuleLoaderApp.mxml --> 
<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" 
    creationComplete="initApp()"> 

    <s:layout> 
     <s:VerticalLayout/> 
    </s:layout> 

    <fx:Script> 
     <![CDATA[ 
     import mx.events.ModuleEvent; 
     import mx.modules.ModuleManager; 
     import mx.modules.IModuleInfo;   
     import mx.core.IVisualElement; 

     public var info:IModuleInfo; 

     private function initApp():void { 
      info = ModuleManager.getModule("ColumnChartModule.swf"); 
      info.addEventListener(ModuleEvent.READY, modEventHandler);   

      /* Load the module into memory. Calling load() makes the 
       IFlexModuleFactory available. You can then get an 
       instance of the class using the factory's create() 
       method. */ 
      info.load(null, null, null, moduleFactory); 
     } 

     /* Add an instance of the module's class to the display list. */   
     private function modEventHandler(e:ModuleEvent):void { 
      /* For MX containers, cast to a DisplayObject. */ 
      vb1.addChild(info.factory.create() as DisplayObject); 

      /* For Spark containers, cast to a UIComponent. */ 
      vg1.addElement(info.factory.create() as IVisualElement); 
     } 
     ]]> 
    </fx:Script> 

    <!-- MX container --> 
    <mx:VBox id="vb1"> 
     <s:Label text="Module loaded in MX VBox container:"/> 
    </mx:VBox> 

    <!-- Spark container --> 
    <s:VGroup id="vg1"> 
     <s:Label text="Module loaded in Spark VGroup container:"/>  
    </s:VGroup> 

</s:Application> 

特定のモジュールとそのメソッドとプロパティを制御できる独自のインターフェイスを作成することができます。インタフェースのmainGroup又はbuttonRowプロパティにアクセスする、モジュール自体で

package main.flex.interfaces 
{ 
    import flash.events.Event; 
    import flash.events.IEventDispatcher; 

    import mx.core.UIComponent; 

    public interface IMyModuleName extends IEventDispatcher 
    { 
     function get mainGroup():UIComponent; 

     function get buttonRow():UIComponent; 

     function init(event:Event):void; 

    } 
} 

、次いで、たとえば、私は最近、二つの成分(Groupのインスタンスであるが、UIComponentとしてキャスト)への参照を返すインタフェースを作成しました

public function get mainGroup() : UIComponent { 
    return someGroup; 
} 

などの名前付きグループを返します。

<s:Group id="someGroup"> 
    <!-- content --> 
</s:Group> 

これらは簡略化されており、実際のIDは使用していませんが、アイデアを得ることができます。

関連する問題