2010-05-17 53 views
0

我正在研究一個樹組件,並且我正在爲此樹填充數據提供程序時遇到一些問題。帶有無限父母和子女的彈性樹

我從數據庫中取回的數據是一個簡單的值對象數組。每個值對象都有2個屬性。 ObjectID和ParentID。對於父母,ParentID爲空,對於孩子,ParentID是父母的ObjectID。

任何幫助,這是非常感謝。

本質上的樹應該是這個樣子:

Parent1 
Child1 
    Child1 
Child2 
    Child1 
    Child2 
Parent2 
Child1 
Child2 
Child3 
    Child1 

這是我與測試當前代碼:

public function setDataProvider(data:Array):void 
{ 
var tree:Array = new Array();  
for(var i:Number = 0; i < data.length; i++) 
{ 

// do the top level array 
if(!data[i].parentID) 
{ 
    tree.push(data[i], getChildren(data[i].objectID, data)); 
} 
} 
function getChildren(objectID:Number, data:Array):Array 
{ 
var childArr:Array = new Array(); 
for(var k:Number = 0; k < data.length; k++) 
{ 
    if(data[k].parentID == objectID) 
    { 
    childArr.push(data[k]); 
    //getChildren(data[k].objectID, data); 
    } 
} 
return childArr; 
} 

trace(ObjectUtil.toString(tree)); 
} 

這裏是我的數據的橫截面:

ObjectID  ParentID 
    1  NULL 
    10  NULL 
    8  NULL 
    6  NULL 
    4  6 
    3  6 
    9  6 
    2  6 
    11  7 
    7  8 
    5  8 

回答

1

那麼,你遇到的實際問題是什麼?

在我看來,你實際上並沒有在你的dataProvider中創建任何子項。每個物體都應該有孩子。這是你的代碼,略有修改,但是完全可運行版本的代碼:

<?xml version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" creationComplete="application1_creationCompleteHandler(event)"> 
    <fx:Declarations> 
     <!-- Place non-visual elements (e.g., services, value objects) here --> 
    </fx:Declarations> 
    <fx:Script> 
     <![CDATA[ 
      import mx.collections.ArrayCollection; 
      import mx.events.FlexEvent; 
      [Bindable] 
      public var data : Array = ([ 
       {objectID:1, parentID:null}, 
       {objectID:10, parentID:null}, 
       {objectID:8, parentID:null}, 
       {objectID:6, parentID:null}, 
       {objectID:5, parentID:6}, 
       {objectID:4, parentID:6}, 
       {objectID:9, parentID:6}, 
       {objectID:2, parentID:6}, 
       {objectID:11, parentID:7}, 
       {objectID:7, parentID:8}, 
       {objectID:5, parentID:8}, 
      ]); 

      [Bindable] 

     public var dataProvider : Array; 



     protected function application1_creationCompleteHandler(event:FlexEvent):void 
     { 
      // TODO Auto-generated method stub 
      setDataProvider(data); 
     } 

     public function setDataProvider(data:Array):void 
     { 
      var tree:Array = new Array();  
      for(var i:Number = 0; i < data.length; i++) 
      { 

       // do the top level array 
       if(!data[i].parentID) 
       { 
        data[i].children = getChildren(data[i].objectID, data); 
        tree.push(data[i]); 
       } 
      } 

      function getChildren(objectID:Number, data:Array):Array 
      { 
       var childArr:Array = new Array(); 
       for(var k:Number = 0; k < data.length; k++) 
       { 
        if(data[k].parentID == objectID) 
        { 
         childArr.push(data[k]); 
         //getChildren(data[k].objectID, data); 
        } 
       } 
       return childArr; 
      } 

//    trace(ObjectUtil.toString(tree)); 
       dataProvider = tree; 
      } 


     ]]> 
    </fx:Script> 

    <mx:Tree id="treeObject" dataProvider="{dataProvider}" /> 

</s:Application>