0

Adobe ドキュメントの状態:

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

アプリケーションがすべて 1 つの MXML 内に含まれている場合は問題ありませんが、モジュール内のコンポーネントの ID を参照するのに問題があり、特定のモジュール内の ViewStacks/Navigation Containers 内で参照できません。

例えば、

FlexGlobals.topLevelApplication.myModule でモジュールを参照できる場合、次のように myModulePanel という Panel を参照できないでしょうか?

FlexGlobals.topLevelApplication.myModule.myModulePanel

または少なくとも

FlexGlobals.topLevelApplication.myModule.getChildByName(myModulePanel)

タイトル、幅などのプロパティは?

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

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

どんな提案でも大歓迎です。

ありがとう。

4

1 に答える 1

0

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

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

<?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>

特定のモジュールとそのメソッドおよびプロパティを制御できる独自のインターフェイスを作成できることに注意してください。たとえば、私は最近、2 つのコンポーネントへの参照を返すインターフェイスを作成しました (これらは のインスタンスですGroupが、としてキャストされますUIComponent)。

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;

    }
}

モジュール自体で、インターフェイスのmainGroupまたはbuttonRowプロパティにアクセスすると、次のような名前付きグループが返されます。

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

...

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

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

于 2011-09-09T16:27:01.137 に答える