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.
任何人都可以指出问题是什么.
问候
你的编码错了.首先,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)
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设计模式)并不是促进松散耦合的唯一工具.在上面的示例中,我展示了另外两种强大的技术 - 对接口和依赖注入进行编程.
| 归档时间: |
|
| 查看次数: |
112 次 |
| 最近记录: |