大家好我试图调用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的引用。
任何人都可以指出问题是什么。??
此致
答案 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(事件);