【问题标题】:closures with popups using flex 4.6使用 flex 4.6 关闭弹出窗口
【发布时间】: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


【解决方案1】:

找到了问题。由于我只附加了一次监听器,它将引用旧监听器,并引用旧数据。我想我希望在创建闭包时更新它的引用。在这种情况下不是。可能的解决方法是删除侦听器并重新添加它,但我放弃了使用闭包的想法,除了 RIAStar 提到的之外,它也是不切实际的,因为它只会通过为处理程序的每次调用创建一个新函数来提供更多开销.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多