Flex - 对象中的对象

时间:2012-03-11 23:30:11

标签: arrays flex object

所以我仍然试图绕过Flex和OOP,现在我被困住了。这是我目前正在使用的代码。

    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。应用程序是ComboBox#1将由labsArray填充,它正在运行。根据数组中[0,1,2]的选择,这将从sets数组中调用匹配位置的数组。

最后,通过选择ComboBox#1,第二个ComboBox#2将更改为匹配选择。

有关如何使对象对象正确呈现的任何帮助都会有很大帮助。此外,如果我的执行不是最好的方法来做任何方向(链接/文档)我也会采取。提前谢谢。

1 个答案:

答案 0 :(得分:0)

我根据您想要完成的内容的假设编辑了原始代码,我将Array对象直接添加到被分配了dataprovider的集合中,在这种情况下,您应该看到调用的.toString()方法的输出Object类.toString()将输出您在显示中看到的[object 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;
   }