2012-03-11 66 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