云自無心水自閑

          天平山上白云泉,云自無心水自閑。何必奔沖山下去,更添波浪向人間!
          posts - 288, comments - 524, trackbacks - 0, articles - 6
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Flex2中遍歷Tree節點

          Posted on 2007-01-07 14:37 云自無心水自閑 閱讀(3489) 評論(1)  編輯  收藏 所屬分類: FlexFlex2

          這個函數只是一個示例函數,演示如何遍歷一個Tree。
          此函數嚴格說起來其實是兩個函數:上半部分用于回溯父節點,下半部分遞歸遍歷子節點

          /**
          ?* This method will traverse a Tree's model independent of it's
          ?* type.
          ?*
          ?* <p>Note :: This method may look long and arduous but, rest assured
          ?* it has all the checks to perform like a champ. Also, you 'could'
          ?* refactor part of this method but, for the sake of explanation, I
          ?* kept it all in one place.</p>
          ?*
          ?* <p>Remember, I had coupled the model to this method by tracing
          ?* @label, obviously you do not need to do this. The intention of
          ?* this example is to show you that the dataDescriptor seperates
          ?* the models type and is awesome. It enables you to create a tight
          ?* method like this without type checks on the model.</p>
          ?*
          ?* @param tree The Tree instance that will be examined by the method.
          ?* @param item An item found in the dataProvider of the Tree passed in.
          ?* @param startAtParent A boolean that determines if the method upon
          ?* initialization will back up one leve3l to the item passed in and
          ?* start it's recursion at the item's parent node.
          ?*/

          public function walkTree(tree:Tree, item:Object, startAtParent:Boolean = false):void
          {
          ? ? // get the Tree's data descriptor
          ? ? var descriptor:ITreeDataDescriptor = tree.dataDescriptor;
          ? ? var cursor:IViewCursor;
          ? ?
          ? ? var parentItem:Object;
          ? ? var childItem:Object;
          ? ? var childItems:Object;
          ? ?
          ? ? // if the item is null, stop
          ? ? if(item == null)
          ? ? ? ? return;
          ? ? ? ?
          ? ? // do we back up one level to the item's parent
          ? ? if(startAtParent)
          ? ? {
          ? ? ? ? // get the parent
          ? ? ? ? parentItem = tree.getParentItem(item);
          ? ? ? ? // is the parent real
          ? ? ? ? if(parentItem)
          ? ? ? ? {
          ? ? ? ? ? ? trace("|-- Parent Node ", parentItem[tree.labelField]);
          ? ? ? ? ? ? // if the parent is a branch
          ? ? ? ? ? ? if(descriptor.isBranch(parentItem))
          ? ? ? ? ? ? {
          ? ? ? ? ? ? ? ? // if the branch has children to run through
          ? ? ? ? ? ? ? ? if(descriptor.hasChildren(parentItem))
          ? ? ? ? ? ? ? ? {
          ? ? ? ? ? ? ? ? ? ? // get the children of the branch
          ? ? ? ? ? ? ? ? ? ? // this part of the algorithm contains the item
          ? ? ? ? ? ? ? ? ? ? // passed
          ? ? ? ? ? ? ? ? ? ? childItems = descriptor.getChildren(parentItem);
          ? ? ? ? ? ? ? ? }
          ? ? ? ? ? ? }
          ? ? ? ? ? ? // if the branch has valid child items
          ? ? ? ? ? ? if(childItems)
          ? ? ? ? ? ? {
          ? ? ? ? ? ? ? ? // create our back step cursor
          ? ? ? ? ? ? ? ? cursor = childItems.createCursor();
          ? ? ? ? ? ? ? ? // loop through the items parent's children (item)
          ? ? ? ? ? ? ? ? while(!cursor.afterLast)
          ? ? ? ? ? ? ? ? {
          ? ? ? ? ? ? ? ? ? ? // get the current child item
          ? ? ? ? ? ? ? ? ? ? childItem = cursor.current;

          ? ? ? ? ? ? ? ? ? ? var label:String = childItem[tree.labelField];
          ? ? ? ? ? ? ? ? ? ? var branch:Boolean = descriptor.isBranch(childItem);
          ? ? ? ? ? ? ? ? ? ?
          ? ? ? ? ? ? ? ? ? ? // good place for a custom method()
          ? ? ? ? ? ? ? ? ? ? trace("Sibling Nodes :: ", label, "Is Branch :: ", branch);
          ? ? ? ? ? ? ? ? ? ?
          ? ? ? ? ? ? ? ? ? ? // if the child item is a branch
          ? ? ? ? ? ? ? ? ? ? if(descriptor.isBranch(childItem))
          ? ? ? ? ? ? ? ? ? ? ? ? // traverse the childs branch all the way down
          ? ? ? ? ? ? ? ? ? ? ? ? // before returning
          ? ? ? ? ? ? ? ? ? ? ? ? walkTree(tree, childItem);
          ? ? ? ? ? ? ? ? ? ? // do it again!
          ? ? ? ? ? ? ? ? ? ? cursor.moveNext();
          ? ? ? ? ? ? ? ? }
          ? ? ? ? ? ? }
          ? ? ? ? }
          ? ? }
          ? ? else// we don't want the parent OR this is the second iteration
          ? ? {
          ? ? ? ? // if we are a branch
          ? ? ? ? if(descriptor.isBranch(item))
          ? ? ? ? {
          ? ? ? ? ? ? // if the branch has children to run through
          ? ? ? ? ? ? if(descriptor.hasChildren(item))
          ? ? ? ? ? ? {
          ? ? ? ? ? ? ? ? // get the children of the branch
          ? ? ? ? ? ? ? ? childItems = descriptor.getChildren(item);
          ? ? ? ? ? ? }
          ? ? ? ? ? ?
          ? ? ? ? ? ? // if the child items exist
          ? ? ? ? ? ? if(childItems)
          ? ? ? ? ? ? {
          ? ? ? ? ? ? ? ? // create our cursor pointer
          ? ? ? ? ? ? ? ? cursor = childItems.createCursor();
          ? ? ? ? ? ? ? ? // loop through all of the children
          ? ? ? ? ? ? ? ? // if one of these children are a branch we will recurse
          ? ? ? ? ? ? ? ? while(!cursor.afterLast)
          ? ? ? ? ? ? ? ? {
          ? ? ? ? ? ? ? ? ? ? // get the current child item
          ? ? ? ? ? ? ? ? ? ? childItem = cursor.current;

          ? ? ? ? ? ? ? ? ? ? var label:String =? childItem[tree.labelField];
          ? ? ? ? ? ? ? ? ? ? var branch:Boolean = descriptor.isBranch(childItem);
          ? ? ? ? ? ? ? ? ? ?
          ? ? ? ? ? ? ? ? ? ? // good place for a custom method()
          ? ? ? ? ? ? ? ? ? ? trace("-- Sub Node :: ", label, "Is Branch :: ", branch);

          ? ? ? ? ? ? ? ? ? ? // if the child item is a branch
          ? ? ? ? ? ? ? ? ? ? if(descriptor.isBranch(childItem))
          ? ? ? ? ? ? ? ? ? ? ? ? // traverse the childs branch all the way down
          ? ? ? ? ? ? ? ? ? ? ? ? // before returning
          ? ? ? ? ? ? ? ? ? ? ? ? walkTree(tree, childItem);
          ? ? ? ? ? ? ? ? ? ? // check the next child
          ? ? ? ? ? ? ? ? ? ? cursor.moveNext();
          ? ? ? ? ? ? ? ? }
          ? ? ? ? ? ? }
          ? ? ? ? }
          ? ? }
          }
          ?



          ?




          評論

          # re: Flex2中遍歷Tree節點  回復  更多評論   

          2007-02-08 11:03 by 永恒
          恩,很好的深度遍歷算法,可以再寫個廣度樹遍歷的實現
          主站蜘蛛池模板: 东阿县| 琼海市| 沾化县| 哈密市| 北安市| 大石桥市| 连州市| 郑州市| 北票市| 沅江市| 华亭县| 松原市| 抚松县| 宝丰县| 思茅市| 龙山县| 元江| 河津市| 海宁市| 郴州市| 东港市| 南岸区| 岳阳县| 建德市| 新平| 汉源县| 随州市| 嫩江县| 安康市| 保康县| 友谊县| 察哈| 德化县| 吴旗县| 茌平县| 嘉禾县| 河池市| 册亨县| 通渭县| 文安县| 洞头县|