Apache flex Flex4:从组件访问主应用程序中的公共方法
我需要能够从Flex4中主应用程序下的组件调用方法。有谁能告诉我不使用FlexGlobals的情况下该怎么做 样本代码随附。提前谢谢Apache flex Flex4:从组件访问主应用程序中的公共方法,apache-flex,actionscript-3,actionscript,flex4,Apache Flex,Actionscript 3,Actionscript,Flex4,我需要能够从Flex4中主应用程序下的组件调用方法。有谁能告诉我不使用FlexGlobals的情况下该怎么做 样本代码随附。提前谢谢 // TestApp.mxml (application) <?xml version="1.0" encoding="utf-8"?> <s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library:
// TestApp.mxml (application)
<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication 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()">
<fx:Script>
<![CDATA[
import com.TestComp;
import mx.managers.PopUpManager;
public function myMethod():void
{
// do something
}
protected function initApp():void
{
var popUp:TestComp = new TestComp();
PopUpManager.addPopUp(popUp, this, true);
}
]]>
</fx:Script>
</s:WindowedApplication>
// TestComp.mxml (component)
<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
width="400" height="300">
<fx:Script>
<![CDATA[
private function doSomething(event:MouseEvent):void
{
// call to myMethod() in TestApp.mxml
}
]]>
</fx:Script>
<s:Button click="doSomething(event)" label="Click Me"/>
</s:Group>
//TestApp.mxml(应用程序)
//TestComp.mxml(组件)
这是个糟糕的设计。您应该提供回调函数或事件侦听器
// TestComp.mxml
<mx:Metadata>
[Event(name="doSomethingEvent", type="flash.events.Event")]
</mx:Metadata>
<mx:Script><![CDATA[
private function doSomething(event:MouseEvent):void
{
this.dispatchEvent(new Event("doSomethingEvent"));
}
]]></mx:Script>
// TestApp.mxml
protected function initApp():void
{
var popUp:TestComp = new TestComp();
popUp.addEventListener("doSomethingEvent", myMethod);
PopUpManager.addPopUp(popUp, this, true);
}
private function myMethod(event: Event): void
{
// do something
}
我同意splash的观点,即它的设计很糟糕,但以下几点应该行得通 //in TestApp protected function initApp():void { var popUp:TestComp = new TestComp(this); PopUpManager.addPopUp(popUp, this, true); } //in TestComp private var app:TestApp; public function TestComp(app:TestApp) { this.app = app; } private function doSomething(event:MouseEvent):void { // call to myMethod() in TestApp.mxml app.myMethod(); } //在TestApp中 受保护的函数initApp():void { var弹出窗口:TestComp=新的TestComp(此); addPopUp(popUp,this,true); } //在TestComp中 私有var应用程序:TestApp; 公共功能测试组件(应用程序:TestApp) { this.app=app; } 私有函数doSomething(事件:MouseEvent):void { //调用TestApp.mxml中的myMethod() app.myMethod(); } 或者你可以这样做 //in TestApp protected function initApp():void { var popUp:TestComp = new TestComp(this); popUp.addEventListener( 'test' , eventListener ); PopUpManager.addPopUp(popUp, this, true); } private function eventListener(event:Event):void { //in which case myMethod doesn't need to be public myMethod(); } //in TestComp private function doSomething(event:MouseEvent):void { dispatchEvent( new Event('test') ); } //在TestApp中 受保护的函数initApp():void { var弹出窗口:TestComp=新的TestComp(此); addEventListener('test',eventListener); addPopUp(popUp,this,true); } 私有函数eventListener(事件:事件):void { //在这种情况下,myMethod不需要是公共的 myMethod(); } //在TestComp中 私有函数doSomething(事件:MouseEvent):void { dispatchEvent(新事件(“测试”); } 最简单的选择 从TestComp中的按钮中取出click处理程序 在主应用程序中,为MouseeEvent向TestComp(如果它是主应用程序的直接子应用程序)或其自身(如果TestComp位于显示列表的更下方)添加侦听器。单击。在处理程序中,测试事件的目标是否是TestComp,如果您有直接引用,则通过==测试,如果没有,则通过“is”测试
这是您刚才付出的最小努力,仍然依赖于(冒泡)事件,而且更“正确”我不明白。。。为什么在调用FlexGlobals.topLevelApplication.doSomething()时遇到问题?有人告诉我这是一种不好的做法。如果你开发一个组件,这是一种不好的做法。然后,如果您将其加载到另一个flex应用程序中,topLevelApplication将与其他人共享。只要你正在创建一个应用程序,它就足够安全了!当您已经可以访问所需的所有内容时,您不应该发送/侦听事件。 //in TestApp protected function initApp():void { var popUp:TestComp = new TestComp(this); popUp.addEventListener( 'test' , eventListener ); PopUpManager.addPopUp(popUp, this, true); } private function eventListener(event:Event):void { //in which case myMethod doesn't need to be public myMethod(); } //in TestComp private function doSomething(event:MouseEvent):void { dispatchEvent( new Event('test') ); }