我正在编写一个 actionScript 类来处理我的 Web 服务调用。当我检索结果时,我想在我的主 mxml 应用程序中调用 setter 方法。我的问题是我不知道如何从我的 actionscript 类访问我的主 mxml 类的 actionScript 部分中的方法,有什么想法吗?
3 回答
David 是对的——虽然您可以从应用程序的任何位置静态访问 Application.mxml 对象的公共成员,但从设计角度来看,这有点禁忌。最好努力实现对象之间的松散耦合,而在 Flex 惯用语中所做的方式通常是扩展 EventDispatcher 并分派事件。例如,您的 WebService 包装器可能如下所示:
public class MyWrapperClass extends EventDispatcher
{
[Event(name="webserviceComplete", type="flash.events.Event")]
public function MyWrapperClass(target:IEventDispatcher=null)
{
super(target);
}
private function handleWebServiceLoadComplete(event:ResultEvent):void
{
dispatchEvent(new Event("webserviceComplete"));
}
public function doWork():void
{
// Load the service, etc., and ultimately call handleWebServiceLoadComplete()...
}
}
...和你的 Main.mxml 文件是这样的:
<mx:Script>
<![CDATA[
private function app_creationComplete(event:Event):void
{
var myWrapper:MyWrapperClass = new MyWrapperClass();
myWrapper.addEventListener("webserviceComplete", mywrapper_webServiceComplete, false, 0, true);
myWrapper.doWork();
}
private function mywrapper_webServiceComplete(event:Event):void
{
// Do the work you would've otherwise done in the public method
}
]]>
</mx:Script>
在这种情况下,最终结果是相同的——完成 Web 服务加载会触发 Main.mxml 中的函数。但请注意mywrapper_webServiceComplete()
是如何私下声明的——它不是由MyWrapperClass
. Main.mxml 只是简单地订阅(用addEventListener()
)在 MyWrapperClass 完成它的工作时得到通知,然后做它自己的工作;MyWrapperClass 对 Main.mxml 的实现细节一无所知,Main.mxml 除了调度一个webserviceComplete
事件并公开一个公共doWork()
方法之外,对 MyWrapperClass 也一无所知。松散耦合和信息隐藏在行动中。
祝你好运!
如果您的类是添加到组件树的 UIComponent,那么您可以使用它的parentApplication
属性。否则,使用静态Application.application
属性,但仅在应用程序初始化完成之后。在此之前,该字段是null
. 私有字段和方法显然无法访问。在 MXML 部分中用显式id
s 声明的元素是公共的。
但是,添加这样的调用会创建一个严格的绑定。您可能需要考虑分派一个事件,并在主应用程序中处理此事件。
如果有人遇到同样的问题:
mx.core.FlexGlobals.topLevelApplication.YOUR_FUNCTION
是访问 main.mxml 中公共函数的语法。