如何在后台生成 xml
例如:
- <node label="menuList">
- <node label="home" >
- <node label="alessandro" >
- <node label="Music" >
- <node label="Downloads" >
- </node>
- </node>
平层数据若想使用树形功能必须要转化成结构化的数据。这里需要一些处理,通常来说是服务器层直接将数据库里的平层数据转换成结构化数据之后再输出
不过是在服务器转还是在flex里转这不是最大问题,实际上是一个算法问题。稍稍涉及到一些数据结构
这个算法肯定是需要用到遍历和递归的。首先从遍历中找出根节点的数据,在你的例子中,就是parentid为空或者是0,这个是你自己定义的,总有根节点吧?
重新遍历,找出parentid为这个根节点id的节点集合,并将这些集合添加到根节点的子集合属性中,比如root.children=foundChildren这样(as是动态的,可以直接添加属性)。
这个逻辑是复用的,root的id可以被认为是一个参数传进来,而需要查找的集合也是一个参数。这样就能在接下来的递归中用到。
接下来遍历root.children,递归调用上面的逻辑。这样一个root对象就可以成为一个结构化的数据。
以下是完整的例子
- <?xml version="1.0" encoding="utf-8"?>
- <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
- creationComplete="mian()"
- >
- <mx:Script>
- <![CDATA[
- import mx.collections.HierarchicalData;
- private var platData:Array=[
- {id:1, parentId:0},
- {id:2, parentId:1},
- {id:3, parentId:1},
- {id:4, parentId:2},
- {id:5, parentId:4},
- {id:6, parentId:4},
- {id:7, parentId:6},
- ];
- private function mian(){
- var root:Object=findChildren(0, platData);
- var tree:Object=platToHierarchical(platData, root[0]);
- var hier:HierarchicalData=new HierarchicalData(tree);
- adg1.dataProvider=hier;
- }
- private function findChildren(parentId:int, source:Array , parentIdField:String="parentId"):Array{
- var children:Array=new Array();
- for each (var item:Object in source){
- if (item[parentIdField]==parentId){
- children.push(item);
- }
- }
- return children;
- }
- private function platToHierarchical(platData:Array, startNode:Object, childrenField:String="children",parentIdField:String="parentId"):Object{
- var children:Array=findChildren(startNode.id, platData, parentIdField);
- var temp:Array=new Array();
- for each (var item:Object in children){
- temp.push(platToHierarchical(platData, item, childrenField, parentIdField));
- }
- startNode[childrenField]=temp;
- return startNode;
- }
- ]]>
- </mx:Script>
- <mx:AdvancedDataGrid x="10" y="10" id="adg1" designViewDataType="tree">
- <mx:columns>
- <mx:AdvancedDataGridColumn headerText="id" dataField="id"/>
- <mx:AdvancedDataGridColumn headerText="parentId" dataField="parentId"/>
- </mx:columns>
- </mx:AdvancedDataGrid>
- </mx:Application>