2010-09-13 69 views
1

我需要能够从位于Flex 4主应用程序下的组件调用方法。请问如何在不使用FlexGlobals的情况下执行此操作?Flex 4:从组件中访问主应用程序中的公共方法

附上示例代码。提前致谢。

// 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> 
+0

我不明白...为什么你有一个问题,呼吁FlexGlobals .topLevelApplication.doSomething(); ? ? ? ? – 2010-09-13 15:19:10

+0

我被告知这是不好的做法。 – Reado 2010-09-13 16:36:47

+0

如果你开发一个组件,这是一个不好的做法。然后,如果您将其加载到另一个Flex应用程序中,则topLevelApplication会将其他人加载。只要你正在创建一个应用程序,它是足够安全的!当你已经有权访问所有你需要的东西时,你应该派遣/监听事件并不是一个好理由。 – 2010-09-14 06:32:51

回答

2

这是糟糕的设计。你应该提供一个回调函数或一个事件监听器。

// 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 
} 

这是一个回调例子:

// TestComp.mxml 

public var doSomethingCallback: Function; 

private function doSomething(event:MouseEvent):void 
{ 
    doSomethingCallback.call(); 
} 

// TestApp.mxml 
protected function initApp():void 
{ 
    var popUp:TestComp = new TestComp(); 
    popUp.doSomethingCallback = myMethod; 
    PopUpManager.addPopUp(popUp, this, true); 
} 

private function myMethod(): void 
{ 
    // do something 
} 
0

我不同意飞溅,它是不好的设计,但下面应该工作

 
//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(); 
} 

,或者你可以这样来做

 
//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')); 
} 
1

最简单的操作重刑?

从TestComp中的按钮中取出单击处理程序。

在您的主应用程序中,为MouseEvent.CLICK添加侦听器到TestComp(如果它是主应用程序的直接子元素)或本身(如果TestComp更靠近显示列表)。在处理程序中,如果您有直接引用,则通过==来测试事件的目标是否为TestComp,如果没有,则通过“is”来测试。

这与你有什么刚才的精力最少,仍然依赖于(冒泡)事件,更“正确”

相关问题