【问题标题】:add Dynamic children to an array or arraycollection将动态子项添加到数组或数组集合
【发布时间】:2009-12-28 02:34:19
【问题描述】:

我对 flex 有点陌生,无法解决这个问题。有人可以帮忙吗?提前致谢。

我有一个字符串列表路径。
路径 1 - “一/二/三”
路径 2 - “一/二/四”
路径 3 - “五/六”

我需要一个高级数据网格来显示像这样的树形结构
一个/
...两个/
........三个/
......四个
五/
.......六
但我想通过数组、对象或数组集合(如适用)来实现这个动态
我需要使用字符串方法遍历每个字符串路径,这不是问题,但是我如何创建“DYNAMIC”(深度)子项?请帮忙,因为我正要拔头发。

【问题讨论】:

  • 感谢 sharvey,递归?您能否指出将其应用于树或广告的示例的特定方向?干杯米奇

标签: apache-flex multidimensional-array


【解决方案1】:

你可以试试这样的:

var paths:Array = ['one/two/three','one/two/four','five/six'];
var pathsCollection:ArrayCollection = new ArrayCollection();

for(var i:int = 0 ; i < paths.length ; i++){
    var folderArr:Array = paths[i].split('/');
    var folderNum:int = folderArr.length;
    var folderLabel:String = '';
    for(var j:int = 0 ; j < folderNum; j++){
        trace(folderLabel+folderArr[j]);
        pathsCollection.addItem({label:folderLabel+folderArr[j],level:j,path:folderArr});
        folderLabel += '...';
    }
}

正如 sharvey 所说,一定要看看递归。

【讨论】:

  • 谢谢乔治 - 非常感谢。我只是不明白我如何得到这个来给出广告或树的深度。递归?您能否指出将其应用于树或广告的示例的特定方向?干杯米奇
【解决方案2】:

当您对包含未知数量元素的对象进行操作时,递归是要走的路。试试这个示例应用程序:

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    creationComplete="{init();}"
    layout="vertical"
    verticalAlign="middle">
<mx:Script>
    <![CDATA[
        import mx.utils.ObjectUtil;
        import mx.collections.HierarchicalData;
        private var paths:Array = ['one/two/three','one/two/four','five/six'];
        private static const DELIMITER:String = "/";

        private function init():void {
            var test:Array = buildHierarchy(paths);
            dg_test.dataProvider = new HierarchicalData(test);
            trace(ObjectUtil.toString(test));
        }

        private function buildHierarchy(arr:Array):Array {
            var ret:Array = new Array();
            var o:Object = new Object();
            /* Loop over the paths array */
            for (var i:int = 0; i < arr.length; i++) {
                /* Split the string block according to the delimiter */
                var parts:Array = String(arr[i]).split(DELIMITER);
                if (parts.length) {
                    /* Make a new object with a label equal to the first string element */
                    o = new Object();
                    o.label = parts[0];

                    /* Remove the first item in the string list */
                    parts.splice(0, 1);

                    /* Important - If the string has remaining members, call this 
                        function again with the remaining members. Assign this to 
                        the 'children' property of the newly created object */
                    if (parts.length > 0) 
                        o.children = buildHierarchy([parts.join(DELIMITER)]);

                    /* Add the object to the new array */
                    ret.push(o);
                }                   
            }
            return ret;
        }
    ]]>
</mx:Script>
<mx:AdvancedDataGrid id="dg_test" height="200" width="400">
    <mx:columns>
        <mx:AdvancedDataGridColumn id="col_label" dataField="label"/>
    </mx:columns>
</mx:AdvancedDataGrid>

此函数将为“字符串/字符串/字符串”块中包含的每个元素调用一次。让这个结构显示在 ADG 中的关键是设置 adg.dataProvider = new HierarchicalData(myArray);

希望这行得通!我无法将代码格式化为 100%,但您应该明白这一点。不要忘记添加关闭应用程序标记。

【讨论】:

  • 感谢 zhaupin,它帮了很多忙,但是,我需要显示的层次结构不应包含新路径一/二/四,而应仅将其添加到创建的原始路径中,如下所示:一/二/三/四五/六我希望这是有道理的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多