2010-05-08 27 views
0

我想知道是否有人可以看看这段代码,并告诉我为什么在从同一文档调用removeSelectedChild时会调用removeSelectedChild工作,但在从子文档调用时返回以下错误/零件。Flex:方法在parentDocument上调用时不起作用

“ArgumentError:错误#2025:提供的DisplayObject必须是调用者的孩子。”

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" > 

    <mx:Accordion id="myAccordion" 
    width="100%" height="100%" 
    selectedIndex="0"> 

    <mx:Script> 
    <![CDATA[ 

     public function removeSelectedChild():void { 
      trace("before"); 
     try { 
       myAccordion.selectedChild.parent.removeChild(myAccordion.selectedChild) 
     } catch(err:ReferenceError) { 
      trace("catch") 
      } 
      trace("after"); 
     } 

    ]]> 

    </mx:Script> 

    <mx:headerRenderer> 
    <mx:Component> 
     <mx:Button click="{ parentDocument.removeSelectedChild() }" /> 
    </mx:Component> 
    </mx:headerRenderer> 

    <mx:HBox> 
    <mx:Button click="{ removeSelectedChild() }" /> 
    </mx:HBox> 

    </mx:Accordion> 

</mx:Application> 

点击在孩子的按钮产生预期的结果,而点击标题删除预期的孩子,但也将引发一个错误,尽管事实上它们都调用同一个方法。

对不起,这个例子是有点人为的,这个问题出现在一个相当复杂的视角,这是使用各种自定义组件。这是我能够以一种方式展示它的唯一方式,这种方式可以让您快速编译,并且易于专注于真实问题而无背景噪音。

我拉着我的头发在这一个,并会真正感激它,如果任何人都可以帮助。

更新:我现在发现在方法执行完成后触发异常。请参阅上面的跟踪说明。在抛出异常之前追踪“之后”。

干杯,

克里斯

回答

0

如您所述,错误不会被您的函数抛出。单击手风琴标题时的默认操作是展开或缩小该元素。由于您正在移除该元素,因此当Flex试图扩展或收缩它时,会出现错误。

您可以通过做它的默认操作停止事件解决它:

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" > 

    <mx:Accordion id="myAccordion" 
        width="100%" height="100%" 
        selectedIndex="0"> 

     <mx:Script> 
      <![CDATA[ 

       public function removeSelectedChild(event:MouseEvent):void { 
        myAccordion.removeChild(myAccordion.selectedChild); 
        event.stopImmediatePropagation(); 
       } 

      ]]> 

     </mx:Script> 

     <mx:headerRenderer> 
      <mx:Component> 
       <mx:Button click="{ parentDocument.removeSelectedChild(event) }" /> 
      </mx:Component> 
     </mx:headerRenderer> 

     <mx:HBox> 
      <mx:Button click="{ removeSelectedChild(event) }" /> 
     </mx:HBox> 

    </mx:Accordion> 

</mx:Application> 
0

不是一个解决办法,但也许是一种解决方法:可以尝试改写这样的方法:

myAccordion.selectedChild.parent.removeChild(myAccordion.selectedChild) 

如果不行,必须有一个在Flex的某个地方出错。

+0

不,这也不能工作。看起来它必须是一个Flex错误。 – ChrisInCambo 2010-05-08 23:42:06

+0

是的,你不能做'child.parent.removeChild(child)'似乎很奇怪。 – Theo 2010-05-09 09:38:17

0

使用“outerDocument”而不是“parentDocument”。定义了一个新的小范围。