在flex中从main调用函数时出错

时间:2011-10-12 05:24:11

标签: actionscript-3 flex actionscript flash-builder

大家好我试图调用main.mxml中定义的函数

   public function btnAcceptCall_clickHandler(event:MouseEvent)
    {
     .....
     }

现在我有一个调用此函数的组件mxml

在这个mxml中我定义了一个函数

private function addNewCaller(event:MouseEvent):void
        {
           mx.managers.PopUpManager.removePopUp(this);
           Main.btnCallAndProfile_clickHandler(event)
        }

问题是它出错了

  

调用可能未定义的方法btnCallAndProfile_clickHandler   通过静态类型Class的引用。

任何人都可以指出问题是什么。??

此致

3 个答案:

答案 0 :(得分:5)

你编码错了。首先,Main.btnCallAndProfile_clickHandler不是错误中提到的静态,也不希望它是静态的。你需要获得Main的实例才能使它工作,但是你这样做意味着你会破坏良好的实践。

Flex是一种基于事件的语言,因此可以使用事件为您完成工作。在这种情况下,在Main中,您将添加一个事件侦听器(比如在creationComplete事件处理程序中):

private function onCreationComplete():void
{
   addEventListener('callAndProfile', btnCallAndProfile_clickHandler);
}

然后从您的addNewCaller函数中执行:

private function addNewCaller(event:MouseEvent):void
{
  dispatchEvent(new Event('callAndProfile', true));
}

答案 1 :(得分:5)

J_A_X答案非常好,但还有另一种方法可以被认为是干净的代码。

定义界面:

interface AcceptCallHandler
{
    function acceptCall(e:MouseEvent):void;
}

然后,您可以在 main.mxml 中实现此界面,并在您的组件中注入 AcceptCallHandler -instance:

<s:Application implements="com.package.handlers.AcceptCallHandler" ...>
    <fx:Script>
        <![CDATA[
            public function acceptCall(e:MouseEvent):void
            {
                //...
            }
        ]]>
    </fx:Script>

    <component:SomeComponent acceptCallHandlerImpl="{this}"/>
</s:Application>

您需要在 SomeComponent 中执行的操作是:

class SomeComponent
{
    private var _acceptCallHandler:AcceptCallHandler;
    public function set acceptCallHandlerImpl(value:AcceptCallHandler):void
    {
        _acceptCallHandler = value;
    }

    private function addNewCaller(event:MouseEvent):void
    {
        mx.managers.PopUpManager.removePopUp(this);
        _acceptCallHandler.acceptCall(event);
    }
}

使用事件机制(和Observer设计模式)并不是促进松散耦合的唯一工具。在上面的示例中,我展示了另外两种强大的技术 - 编程到接口依赖注入

答案 2 :(得分:0)

如果main.mxml是您的默认应用程序。你可以这样做:

Application.application.btnCallAndProfile_clickHandler(事件);

相关问题