zoukankan      html  css  js  c++  java
  • flex tree实现延时加载

    因数据量较大,一下子全部提取上来比较耗时间,所以项目中决定用延时加载,在看的时候 。注意一下initialize、itemOpen事件,还有isBranch、和isLoad属性。搞清楚了这几个重要的东西,基本上就能明白了,下面贴代码
    flex代码:
    1. <mx:Tree id="agencyTree"
    2. horizontalScrollPolicy="on"
    3. width="190"
    4. labelField="@name"
    5. height="100%"
    6. scroll="agencyTree_scrollHandler(event)"
    7. dataProvider="{agencyList}"
    8. change="treeChanged(event)"
    9. initialize="agencyTree_initializeHandler(event)"
    10. itemOpen="agencyTree_itemOpenHandler(event)"
    11. click="agencyTree_clickHandler(event)">
    12. </mx:Tree>
    复制代码
    1. //获取结构树
    2. public function findAgency_resultHandler(result:ResultEvent):void
    3. {
    4. agencyList=new XML(result.message.body);
    5. if (agencyTree != null)
    6. {
    7. agencyTree.callLater(expandTree);
    8. }
    9. }
    复制代码

    initialize取得初始化要显示的数据

    1. //调用后台java中的方法(findDistrictsxmlByUser)
    2. districtProxy.findDistrictsxml().addResultListener(findDistricts_resultHandler);
    复制代码
    findDistrictsxmlByUser代码
    1. public String findDistrictsxmlByUser(User user) throws ServiceException,
    2. SQLException {
    3. String endNode = new String("</node>");
    4. StringBuffer strXML = new StringBuffer();
    5. District district1 = districtDAO.find(District.class, user.getAgency()
    6. .getDistrictId());
    7. strXML.append("<node id='" + district1.getId() + "' name='"
    8. + district1.getName() + "' level='" + district1.getLevel()
    9. + "' code='" + district1.getCode() + "' isLoad='" + "true"
    10. + "' isBranch='" + true + "'>");
    11. List<District> subDistricts = districtDAO.findDistrctByParentId(user
    12. .getAgency().getDistrictId());
    13. District district;
    14. for (int i = 0; i < subDistricts.size(); i++) {
    15. district = subDistricts.get(i);
    16. List<District> districts = districtDAO
    17. .findDistrctByParentId(district.getId());
    18. // 如果有叶子节点isBranch=true ,否则不管
    19. if (districts != null && districts.size() > 0) {
    20. strXML
    21. .append("<node id='" + district.getId() + "' name='"
    22. + district.getName() + "' level='"
    23. + district.getLevel() + "' code='"
    24. + district.getCode() + "' isLoad='" + "false"
    25. + "' isBranch='" + true + "'>");
    26. } else {
    27. strXML.append(strXMLAppendAddIsLoad(district));
    28. }
    29. strXML.append(endNode);
    30. }
    31. strXML.append(endNode);
    32. return strXML.toString();
    33. }
    复制代码

    特别注意上边拼字符串中的 isBranch='" + true + "',这个表示当前是非叶子节点,当初为了找这个可是花了些时间,然后里面还有个isLoad属性,先不用管到了后面你就知道了

    下面给tree添加一个itemOpen事件agencyTree_itemOpenHandler,即每次打开时候去后台取数据
    agencyTree_itemOpenHandler:


    1. private var currentItem:XML;
    2. [Bindable]
    3. //点击机构树节点的时候
    4. protected function agencyTree_itemOpenHandler(event:TreeEvent):void
    5. {
    6. if(event.type == TreeEvent.ITEM_OPEN){
    7. var e:TreeEvent = TreeEvent(event);
    8. currentItem = XML(e.item);
    9. //此时这句话的作用来了,当isLoad为false的时候才去后台去数据,取完之后把isLoad改为true,这样下次点击的时候
    10. //就不会在去取数据了。如果不加这个判断的话 ,每次点开节点的时候都会重复的添加数据
    11. if(currentItem.@isLoad == "false"){
    12. agencyProxy.findAgencyByParentId(currentItem.@id).addResultListener(agencyTree_itemOpenHandler_result);
    13. }
    14. }
    15. }
    16. public function agencyTree_itemOpenHandler_result(event:ResultEvent):void
    17. {
    18. var subAgencyData:XMLList = new XMLList(event.message.body.toString());
    19. // currentItem.appendChild(subAgencyData);//这两种方法都可以,但是下面那种速度快很多
    20. currentItem.node += subAgencyData;
    21. //自动获取树数据超过显示范围时没有自动生成滚动条.好犀利
    22. (agencyTree.dataProvider as XMLListCollection).itemUpdated(currentItem);
    23. (agencyTree.dataProvider as XMLListCollection).dispatchEvent(new CollectionEvent(CollectionEvent.COLLECTION_CHANGE, false, false, CollectionEventKind.ADD, -1, -1, [currentItem]));
    24. currentItem.@isLoad = "true";
    25. }
    复制代码

    findAgencyByParentId跟上面java中的方法类似就不列举出来了,至此flex tree的延时加载就实现了。唉,想想当时做的时候可费了我不少时间,在此记录一下,也为其他的朋友做做参考吧 ,,嘿嘿

    效果图
    QQ截图未命名.jpg
    2011-4-26 12:52 上传
    下载附件 (30.63 KB)
  • 相关阅读:
    iptables允许FTP
    FTP服务添加用户及设置权限
    Python之异步IO&RabbitMQ&Redis
    Python之生产者&、消费者模型
    如何使用Git上传项目代码到github
    11-3 基于cookie和session的登录模块
    11-1 会话控制cookie
    11-2 会话控制session
    10-4 文件的下载
    10-3 文件的上传
  • 原文地址:https://www.cnblogs.com/wei2yi/p/2105079.html
Copyright © 2011-2022 走看看