2010-05-17 2 views
0

Je travaille sur un composant arborescence et j'ai un peu de problème avec le remplissage du fournisseur de données pour cet arbre.Flex Tree avec des parents et des enfants infinis

Les données que je récupère de ma base de données sont un simple tableau d'objets de valeur. Chaque objet de valeur a 2 propriétés. ObjectID et ParentID. Pour les parents, le ParentID est null et pour les enfants, ParentID est l'ObjectID du parent.

Toute aide avec ceci est grandement appréciée.

Essentiellement l'arbre devrait ressembler à ceci:

Parent1 
Child1 
    Child1 
Child2 
    Child1 
    Child2 
Parent2 
Child1 
Child2 
Child3 
    Child1 

Ceci est le code actuel que je teste avec:

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)); 
} 

Voici une section transversale de mes données:

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

Répondre

1

Alors, quel est le problème réel que vous rencontrez?

Il me semble que vous ne créez pas d'enfants dans votre DataProvider. Chaque objet devrait avoir des enfants. Ceci est votre code, légèrement modifié, mais la version complètement exécutable de votre code:

<?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>