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

Muh*_*mar 0 apache-flex actionscript actionscript-3 flash-builder

嗨伙计们,我试图调用main.mxml中定义的函数

   public function btnAcceptCall_clickHandler(event:MouseEvent)
    {
     .....
     }
Run Code Online (Sandbox Code Playgroud)

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

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

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

问题是它给出了一个错误

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

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

问候

J_A*_*A_X 5

你的编码错了.首先,Main.btnCallAndProfile_clickHandler不是错误中提到的静态,也不希望它是静态的.你想得到一个Main让它工作的实例,但是你这样做意味着你会破坏良好的做法.

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

private function onCreationComplete():void
{
   addEventListener('callAndProfile', btnCallAndProfile_clickHandler);
}
Run Code Online (Sandbox Code Playgroud)

然后从你的addNewCaller功能,你会做:

private function addNewCaller(event:MouseEvent):void
{
  dispatchEvent(new Event('callAndProfile', true));
}
Run Code Online (Sandbox Code Playgroud)


Vla*_*kov 5

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

定义一个接口:

interface AcceptCallHandler
{
    function acceptCall(e:MouseEvent):void;
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以在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>
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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