1、Flex 树形菜单动态加载 Flex Tree Dynamic Loading1. 设计目标:Flex 中 Tree 动态加载,即在点击之后才加载下级目录的内容. 2. 概要设计:Tree 的属性: dataDescriptor=“new CategoryTreeDataDiscriptor()“ dataProvider=“Category.root“ id=“treeCategory“ 通过 root 对象与 dataDescriptor 提供给 Tree 数据.初始化成功后即在 Tree 上监听函数: treeCategory.addEventListener(TreeEvent.ITE
2、M_OPEN, treeOpenHandler); 在 TreeEvent.ITEM_OPEN 发生之后,读取数据库或其他数据源的数据,以建立其下级目录.3. 实现代码:在用户登录成功之后会立即读取数据并新建其对应的根目录,并将其赋值给静态变量 Category.root. 为了提示用户目录正在加载,同时也作为已经加载过的标记,为每个新建的Category 中加入一个 fake Category; 实现方法: category 的代码,在每次新建 category 的时候都会增加 fake,当建立 fake 时不会增加. view plaincopy to clipboardprint?1.
3、public class Category 2. 3. public static var fake:Category = new Category(true); 4. fake.label = “Loading“; 5. 6. Bindable 7. public static var root : Category; 8. 9. public var id:int; 10. public var label : String; 11. public var subCats : ArrayCollection; 12. public var notes : ArrayCollection;
4、13. public var parent : Category; 14. 15. public function Category(isFake:Boolean=false) 16. if(!isFake) 17. addSubCat(fake); 18. 19. 20. treeOpenHandler:如果为第一次展开即其子目录只有一个,并且为 fake,则读取数据源数据,建立其下级目录对象,将下级目录对象加入到该目录的子目录 ArrayCollection 中. 1. /Tree 响应函数,展开后读取子目录 2. private function treeOpenHandler(e:Tr
5、eeEvent):void 3. openingItem = e.item as Category; 4. LogUtils.defaultLog.info(openingItem.label + “ is opened“);5. if(openingItem = Category.fake) 6. Alert.show(“正在加载,请稍候.“); 7. return; 8. 9. if(openingItem as Category).subCats = null) 10. return; 11. 12. if(openingItem as Category).subCats.length
6、!=1 | (openingItem as Category).subCats0 != Category.fake) 13. return; 14. 15. var sql:String = 16. “SELECT * FROM Cat WHERE user_ID=“ + currentUser.id + “ AND “ + “parent_ID=“ + openingItem.id + “;“; 17. SQLUtils.createAndExecuteStatement(conn,sql,null,loadSubCatsOk,loadSubCatsError); 18. 19. 20. /
7、当 load 正常时,运行,增加子目录,首先会删除 fake. 21.private function loadSubCatsOk(e:SQLEvent):void 22. var CatsFromDB:SQLResult = e.target.getResult(); 23. if(CatsFromDB.data = null) 24. openingItem.subCats.removeAll(); 25. LogUtils.defaultLog.info(openingItem.label + “没有子目录“); 26. return; 27. 28. openingItem.subCats.removeAll(); 29. for(var i:int=0; i