2010-05-17 5 views
0

트리 구성 요소로 작업 중이며이 트리의 데이터 공급자를 채우는 데 문제가 있습니다.무한한 부모와 자식이있는 플렉스 트리

데이터베이스에서 가져온 데이터는 값 개체의 간단한 배열입니다. 각 값 개체에는 2 개의 속성이 있습니다. ObjectID 및 ParentID. 부모의 경우 ParentID는 null이고 자식의 경우 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> 
: 이것은 당신의 약간 수정 된 코드,하지만 코드를 완전히 실행 가능한 버전입니다
관련 문제