2012-08-27 45 views
0

這些是同一個應用程序下的第一個腳本正在申請中,第二個腳本在dataGrid下。從第一個腳本到outerClick()我正在訪問itemrenderer中的inner()函數。那麼我可以通過outerDocument對象輕鬆地從innerClick()訪問函數outer(),但是可以使用what_to_use從outerClick()函數訪問itemrenderer中的inner()函數。我嘗試過使用mx:component id「」和class =「」,但它無法識別itemrenderer下的函數。如果我們可以通過使用「outerdocument」對象從渲染項目訪問外部函數,那麼我們不能從外部訪問內部函數。

<mx:Script> 
    <![CDATA[ 

     public function outer():void{ 
      Alert.show("Hi i am outer object"); 
      } 
     public function outerClick():void{ 
      what_to_use.inner(); 
     } 
    ]]> 
</mx:Script> 

以下項目在數據網格下呈現。

<s:itemRenderer> 
     <mx:Component> 
      <s:GridItemRenderer> 
       <fx:Script> 
        <![CDATA[ 
          public function innerClick():void{ 
           outerDocument.outer(); 
          } 
          public function inner():void{ 
           Alert.show("Hi i am inner"); 
          } 
        ]]> 
       </fx:Script> 
        <s:CheckBox id="sel" selected="{data.checked=sel.selected}" change="{data.checked}" click="innerClick()"/>         
      </s:GridItemRenderer> 
     </mx:Component> 
    </s:itemRenderer> 

回答

3

如果我們可以通過使用 「添加outerDocument」對象然後傾斜我們從 訪問內部函數外部訪問從再現項目外的功能。?

你似乎對itemRenderer是什麼有一個明顯的誤解。 itemRenderer是一個組件定義,有點像創建你自己的類。因爲您正在使用'outerDocument'引用,所以您正在創建自己的類,並且嵌入另一個類中。

您的自定義itemRenderer類的實例是爲基於List的類中的每個可見項目創建的;所以你自己的類被多次創建,這意味着你的itemRenderer函數有超過1個實例。 Flex如何知道要調用哪個itemRenderer實例?事實上它不能。

這就是爲什麼你可以打電話,但你不能打電話。

如果您需要在itemRenderer中進行更改,您應該通過更改dataProvider的數據元素來進行更改。

對於所有的意圖和目的,我建議不要使用outerDocument。這是封裝中的一個突破。一個組件不應該嘗試訪問其父';因爲這通常會給組件帶來不必要的依賴,限制了重用。 「溝通」的正確方法是從itemRenderer派發一個事件並在父類中偵聽它。

對您的previous questions之一的答案簡要介紹了此概念。

+1

我終於通過派發一個事件來實現它。感謝您解釋這個概念。它清除了我的一些誤解...... –

相關問題