Adobe docs说:
MXML组件中所有标记的ID,无论它们嵌套的程度如何,都会生成所定义组件的公共变量。因此,所有id属性在文档中必须是唯一的。这也意味着,如果为组件实例指定了ID,则可以从应用程序的任何位置访问该组件:从函数,外部类文件,导入的ActionScript文件或内联脚本。
如果您的应用程序全部包含在一个MXML中,那么这很好,但是我在模块中引用组件的ID时遇到了问题,然后在给定模块中的ViewStacks / Navigation Containers内部。
例如,
如果我可以使用FlexGlobals.topLevelApplication.myModule引用模块,我是否应该使用以下内容引用名为myModulePanel的Panel?
FlexGlobals.topLevelApplication.myModule.myModulePanel
或至少
FlexGlobals.topLevelApplication.myModule.getChildByName(myModulePanel)
用于标题,宽度等属性?
由于组件ID是公共变量(根据文档),我不认为我必须链接一系列.getChildByName()函数来深入到组件/容器级别以访问组件属性,但是我上面尝试过的方法似乎没有用。
但是如果是这种情况,我是否真的需要形成一长串的组件引用来访问ViewStacks等的子代,然后检查这个层次结构的最佳方法是什么?
任何建议都将不胜感激。
感谢。
答案 0 :(得分:0)
您应该为每个模块(或所有模块订阅的一个主接口)创建一个接口,定义需要在模块外部调用的方法。这样你就可以与界面交互,而不是模块本身,但是接口方法在模块类和主应用程序之间进行调解。
使用IModuleInfo
加载的ModuleManager
界面可以帮助您实现这一目标。有关详细信息,请参阅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>
请注意,您仍然可以创建自己的界面,以便控制特定模块及其方法和属性。例如,我最近创建了一个接口,该接口返回对两个组件的引用(它们是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>
这些是简化的,不使用真实身份证,但您应该能够从中获取想法。