Flex: ссылка на идентификаторы компонентов в модулях, вложенные стеки просмотра и т. Д. - PullRequest
0 голосов
/ 24 декабря 2010

Состояние документов Adobe:

Идентификаторы для всех тегов в компоненте MXML, независимо от того, насколько глубоко они вложены, генерируют открытые переменные определяемого компонента. В результате все свойства идентификатора должны быть уникальными в пределах документа. Это также означает, что если вы указали идентификатор для экземпляра компонента, вы можете получить доступ к этому компоненту из любого места приложения: из функций, внешних файлов классов, импортированных файлов ActionScript или встроенных сценариев.

Это нормально, если все ваше приложение содержится в одном MXML, но у меня возникают проблемы со ссылками на идентификаторы компонентов внутри модулей, а затем внутри ViewStacks / Navigation Containers в данном модуле.

Например,

Если я могу ссылаться на модуль с помощью FlexGlobals.topLevelApplication.myModule, я не смогу ли я ссылаться на панель myModulePanel со следующим?

FlexGlobals.topLevelApplication.myModule.myModulePanel

или хотя бы

FlexGlobals.topLevelApplication.myModule.getChildByName(myModulePanel)

для таких свойств, как заголовок, ширина и т. Д.

Поскольку идентификаторы компонентов являются открытыми переменными (в соответствии с документами), я не думал, что мне нужно было бы связывать последовательность функций .getChildByName () для детализации до уровня компонента / контейнера для доступа к свойствам компонента, но методы, которые я пробовал выше, похоже, не работают.

Но если это так, действительно ли мне нужно формировать длинную цепочку ссылок на компоненты для доступа к потомкам ViewStacks и т. Д., И каков наилучший способ проверить эту иерархию?

Любые предложения будут с благодарностью.

Спасибо.

1 Ответ

0 голосов
/ 09 сентября 2011

Вы должны создать интерфейс для каждого модуля (или один основной интерфейс, на который подписываются все ваши модули), определяя методы, которые должны вызываться вне модулей.Таким образом, вы взаимодействуете с интерфейсом, а не с самим модулем, но методы интерфейса являются посредниками между классами модуля и основным приложением.

Использование интерфейса 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>

Обратите внимание, что вы все еще можете создавать свои собственные интерфейсы, которые дают вам контроль над конкретными модулями, их методами и свойствами.Например, я недавно создал интерфейс, который возвращает ссылку на два компонента (которые являются экземплярами 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;

    }
}

Затем в самих модулях осуществляется доступ к *Свойства интерфейса 1015 * или buttonRow возвращают именованную группу, например

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

...

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

Они упрощены и не используют реальные идентификаторы,но вы должны быть в состоянии понять их.

...