2010-05-08 25 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」。定義了一個新的小範圍。