2010-07-09 51 views
0

我有一個自定義Flex容器組件在AS3中編寫,名爲StatisticsContainer。在應用程序中使用時,它包含名爲統計框的各種自定義標籤組件。所以可能有一個StatisticsContainer包含3個StatisticsBox:「averageAge」,「divorceRate」和「infantMortalityRate」。元素應該如何在Flex中沒有硬編碼的情況下在樹的更深處獲取引用?

StatisticsContainer需要能夠引用和操作所有統計框。但是我不想將這些引用硬編碼到StatisticsContainer中,因爲會有各種不同的StatsContainer實例,其中包含不同的StatisticsBox。

那麼我該如何動態地給StatisticsContainer一個包含所有統計框的ArrayCollection?

到目前爲止,我開始在StatisticsContainer的creationComplete這樣的功能:

for (var i:int = 0; i < numElements; i++) { 
    if (getElementAt(i) is StatisticsBox) { 
    statisticsBoxes.addItem(getElementAt(i)); 
    } 
} 

這隻有在StatisticsBoxes是直接subchildren。無論如何,這感覺有點哈克。

然後我試着在StatisticsContainer中偵聽CreationComplete事件。但是這些不會從StatisticsBox到達,因爲它們不會冒泡。

最後,我創建了我自己的事件,我用StatsComplete中的creationComplete來觸發它,並在StatisticsContainer中偵聽它。這是有效的,但這真的是最好的方法嗎?

回答

1

創建時,您可以讓每個StatisticsBox自行註冊其StatisticsBoxContainer

StatisticsBoxContainer.mxml

<?xml version="1.0"?> 
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:local="*"> 
    <mx:Script><![CDATA[ 
     import mx.collections.ArrayCollection; 

     public var statisticsBoxes:ArrayCollection = new ArrayCollection(); 

]]></mx:Script> 

    <local:StatisticsBox id="stats1" /> 
    <local:StatisticsBox id="stats2" /> 
    <local:StatisticsBox id="stats3" /> 

</mx:Canvas> 

StatisticsBox.mxml

<?xml version="1.0"?> 
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="onCreationComplete()"> 
    <mx:Script><![CDATA[ 

     private function onCreationComplete():void { 
      StatisticsBoxContainer(parentDocument).statisticsBoxes.addItem(this); 
     } 

]]></mx:Script>  
</mx:Canvas> 

我不知道這是不是通過孩子循環雖然或多或少哈克。你現在如何循環的問題是你需要遞歸循環通過兒童,孫輩等。

0

我已經在幾個不同的項目中有確切的問題。爲了速度的緣故,我通過快速循環遍歷所有孩子,完全按照您的方式完成創作,並且感覺就像「骯髒」和「哈克」一樣,但是它完成了工作。

ActionScript並不像其他語言那麼成熟,所以很多解決方案都需要快速破解,因爲正確執行它需要編寫整個框架,這是不切實際的。

我也使用Application.application對象解決了這個問題,這是一個很酷的小技巧來獲取對事物的全局引用。我在我的應用程序中需要單例實例時使用它。再次,哈克,但優雅簡單。

將此應用於您的情況,而不是觸發一個必須將代碼全部展開的事件,只要創建了「子框」(您的自定義事件過去是發射):

Application.application.StatisticList.addItem(this); 

我在這些情況下使用的另一個很酷的技巧是字典而不是ArrayCollections。他們讓我有能力在我需要時進行「即時查詢」,同時在必要時仍允許迭代。您可以迭代鍵和字典的值。該代碼變得有點像:

Application.application.StatisticList[this.id] = this; 

現在您可以通過三種方式的統計數據:

通過直接ID
    1. 立即在「秩序」,遍歷所有的ID
    2. 在「順序「遍歷所有StatisticBox對象(ArrayCollection的相同功能)

    我希望有一些幫助在某種程度上,

    --gMale

  • 相關問題