【发布时间】:2014-04-21 13:54:19
【问题描述】:
我有这个自定义事件处理程序,它显示一个弹出窗口并接受来自用户的输入:
private var mySkinnablePopupContainer:MySkinnablePopupContainer;
private function handleShowGridPopupEvent(event:ShowGridPopupEvent):void {
var mouseDownOutSideHandler:Function = function(mdEvent:FlexMouseEvent):void {
// At this point, event.targetControl contains the wrong object (usually the previous targetControl)
if (mdEvent.relatedObject != event.targetControl) {
mySkinnablePopupContainer.close();
}
}
var gridPopupSelectionHandler:Function = function(popEvent:PopUpEvent):void {
if (!popEvent.commit) return;
// At this point, event.targetData contains the wrong object (usually the previous targetData)
myModel.doSomethingWithData(popEvent.data.selectedItem, event.targetData);
}
if (!mySkinnablePopupContainer) {
mySkinnablePopupContainer = new MySkinnablePopupContainer();
mySkinnablePopupContainer.addEventListener(PopUpEvent.CLOSE, gridPopupSelectionHandler);
mySkinnablePopupContainer.addEventListener(FlexMouseEvent.MOUSE_DOWN_OUTSIDE, mouseDownOutSideHandler);
}
// At this point, event.targetData contains the correct object
mySkinnablePopupContainer.dataProvider = getMyDPArrayCollection(event.targetData);
mySkinnablePopupContainer.open(this);
var point:Point = event.targetControl.localToGlobal(new Point());
mySkinnablePopupContainer.x = point.x + event.targetControl.width - mySkinnablePopupContainer.width;
mySkinnablePopupContainer.y = point.y + event.targetControl.height;
}
每次调用函数处理程序时,它都会有正确的 ShowGridPopupEvent 对象,但在它调用 gridPopupSelectionHandler,它将包含来自先前调用的旧对象。它第一次工作,后续调用失败。 在打开弹出窗口之前和之后,对事件对象的引用不知何故发生了变化。 知道我在这里做错了什么吗?这是 flex 的错误吗?
【问题讨论】:
-
对我来说似乎是一个范围界定问题。从我的脑海中开始:我认为在外部函数范围内创建对这两个变量的引用并访问它就足够了(
var data:MyData = event.targetData;)。请注意,使用这种编码风格(嵌套事件处理程序和所有),您会使您的代码 (a) 更难阅读和调试,并且 (b) 容易出现此类范围问题。
标签: actionscript-3 apache-flex flex4