Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flex Flex4:从组件访问主应用程序中的公共方法_Apache Flex_Actionscript 3_Actionscript_Flex4 - Fatal编程技术网

Apache flex Flex4:从组件访问主应用程序中的公共方法

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:

我需要能够从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://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') ); }