我有这个自定义事件处理程序,它显示一个弹出窗口并接受来自用户的输入:
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的错误吗?
答案 0 :(得分:0)
找到了概率。由于我只将侦听器附加一次,它将引用旧的侦听器,并引用旧数据。我想我希望每当我创建闭包时它的引用都会更新。不是在这种情况下。可能的解决方法是删除侦听器并重新添加它但我放弃了使用闭包的想法,除了RIAStar提到的内容之外,它也是不切实际的,因为它只通过为每次调用处理程序创建一个新函数来提供更多的开销