2012-03-11 89 views
0

所以我仍然試圖讓我的頭繞着Flex和OOP,現在我被困住了。這是我目前正在使用的代碼。Flex - 對象內的對象

var labs:ArrayCollection = new ArrayCollection(); 
    var sets:ArrayCollection = new ArrayCollection(); 

    var labsArray:Array = ["ProDPI","WHCC","Tin"]; 
    var setsArray:Array = [ ["Set01","Set02","Set03","Set04"],["Set11","Set12","Set13","Set14"], ["Set21","Set22","Set23","Set24"] ]; 

    var objLab:Object = new Object; 
    objLab.labName = labsArray[0]; 
    objLab.setFolders = undefined; 
    labs.addItem(objLab); 

    for (var i:int = 0; i < setsArray.length; i++) { 
     var objSets:Object = new Object; 
     objSets.setName = setsArray[i]; 
     sets.addItem(objSets); 
     objLab.setFolders = objSets; 
    } 
    labFolderList.labelField="labName"; 
    labFolderList.dataProvider=labs; 

    setFolderList.labelField="setFolders"; 
    setFolderList.dataProvider=sets; 

objLab對象正在返回,因爲我希望它。 objSets在我的ComboBox中顯示爲object,Object。應用程序是ComboBox#1將填充labsArray,它正在工作。根據數組中[0,1,2]的選擇,這將從sets數組中調用匹配位置中的數組。

最後,隨着組合框#1的選擇,第二組合框#2將變成匹配選擇。

任何關於如何讓對象正確渲染的幫助將會有很大的幫助。此外,如果我的執行不是最好的方式做任何方向(鏈接/文檔),我會採取。提前致謝。

+0

嗨@Bungdaddy可以提供更多的代碼相對於選擇更改處理初始組合框,也許有些MXML的也只是這樣我就可以得到一個更清楚地描述你要做什麼,這個解釋是相當不錯的,但是用更多的代碼來回答會更容易。此外,上面顯示的是一個開放的for循環,最好將代碼複製/粘貼到堆棧溢出的文本編輯器中,然後突出顯示所有粘貼的代碼並點擊文本區域上方的{}按鈕(說明它似乎被切斷)。 – shaunhusain 2012-03-12 00:55:56

回答

0

我編輯了你原來的代碼,基於你試圖完成的假設,我將Array對象直接添加到被分配給數據提供者的集合中,在這種情況下,你應該看到調用的.toString()方法的輸出在Array而不是Object類中,Object類.toString()將輸出您在顯示中看到的[object Object]。 Array .toString()方法將在數組中的每個元素上調用.toString(),並用逗號分隔它們,並用花括號將它們包圍起來,這與定義數組時非常相似。或者,您可以創建自己的類來擴展Object,並使您自己的toString方法覆蓋默認行爲,使用Object通常不是一個好習慣(有例外情況,這不是一個硬性規則,但它往往會更好地使用特定類的類型,或者甚至更好的接口)。

var labs:ArrayCollection = new ArrayCollection(); 
    var sets:ArrayCollection = new ArrayCollection(); 

    var labsArray:Array = ["ProDPI","WHCC","Tin"]; 
    var setsArray:Array = [ ["Set01","Set02","Set03","Set04"],["Set11","Set12","Set13","Set14"], ["Set21","Set22","Set23","Set24"] ]; 

    var objLab:Object = new Object; 
    objLab.labName = labsArray[0]; 
    objLab.setFolders = undefined; 
    labs.addItem(objLab); 

    for (var i:int = 0; i < setsArray.length; i++) { 
     sets.addItem(setsArray[i]); 
     objLab.setFolders = setsArray[i]; 
    } 
    labFolderList.labelField="labName"; 
    labFolderList.dataProvider=labs; 

    setFolderList.labelField="setFolders"; 
    setFolderList.dataProvider=sets; 

從製造類爲我解釋上面是使用的labelFunction,而不是將labelField,使用的labelFunction每個項目的另一種選擇一邊:dataProvider對象將被傳遞到您的自定義的labelFunction,你可以返回字符串基於你認爲合適的任何邏輯。這將是沿着這些路線的東西:

setFolderList.labelFunction = myLabelFunction; 

    private function myLabelFunction(item:Object):String 
    { 
     var retString:String = ""; 
     for(var i:int=0; i<item.setName.length; i++) 
     { 
      if(i>0) 
       retString += ", "; 
      retString += item.setName[i]; 
     } 
     return retString; 
    } 
+0

謝謝@shaunhusain - 這是兩個很好的答案。我將不得不嘗試看看最後努力的結果。感謝您的詳細解釋。另外如果你有額外的Flex資源推薦,我將不勝感激。我使用Flex作爲與Photoshop面板的接口 - 這是一個陡峭的學習曲線。 - 這裏還有Depaul Alum! – Bungdaddy 2012-03-12 04:29:05

+0

@Bungdaddy很高興能爲你工作,並驚訝你閱讀我的個人資料,我從字面上只是更新了(去徽章......該死的你)。當我第一次學習flex時,「一週中的Flex」視頻是最好的介紹,也是James Ward,Doug McCune,Ted Patrick(sencha一個不是維基百科,程序員不是deprogrammer,儘管其他人也有一個有趣的故事),而且我確定很多其他人都有很多好東西(谷歌他們中的任何一個鏈接對於評論來說太長)。我在我的網站上分享了代碼,雖然它還沒有更新(並且從未完成)多年。 – shaunhusain 2012-03-12 04:44:12