博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
YUI3自动加载树实现
阅读量:5318 次
发布时间:2019-06-14

本文共 4946 字,大约阅读时间需要 16 分钟。

treeview代码参见前一篇

在treeview修改本地化实现后,就要考虑如何去实现自动加载树的代码

在ExtJS里是通过继承并扩展TreePanel功能实现的,但是YUI3的widget继承有些问题(见Datatable)

还是和Datatable的处理方式一样,为Treeview编写一个专门的plugin插件来解决问题

这个plugin做两件事:

1、在树创建后创建树的根节点及第一层节点,并定义各节点是否可展开

2、在用户操作展开节点时获取下一层节点

这样,在前台脚本里,创建树的代码就简洁到了极致

首先,module里需要引入本地的treeview模块及插件模块(自己编写的dataquery),然后指定名称创建树

var Y = YUI({        modules: {            。。。。。。            treeview: { async: false, fullpath: '../scripts/gallery/treeview.js' },            dataquery: { async: false, fullpath: '../scripts/core/dataquery.js' }        }    }).use(。。。。。。。 'dataquery',  'treeview', function(Y) {        var treeview = new Y.TreeView({            startCollapsed: false,            toggleOnLabelClick: false        });        treeview.plug(Y.TreePlugin.TreeLoaderPlugin, { treename: 'navigator' });        treeview.render("#cattree1");    });

这里可以看到,跟标准的demo代码比,完全没有了啰嗦的treenode的数据,treeview创建的代码只需要1个参数:startCollapsed,设定开始时根展开(toggleOnlabelClick可有可无),然后再plug一下TreeLoaderPlugin就可以了

效果图如下,比原始的那个没图的版本已经耐看多了,+-号标记还需要再改小点,感觉大了有点难看

 TreeLoaderPlugin的代码如下:

function TreeLoaderPlugin(config) {        TreeLoaderPlugin.superclass.constructor.apply(this, arguments);    };    Y.mix(TreeLoaderPlugin, {        NAME: 'treeLoaderPlugin',        NS: 'treeloaderplugin',        ATTRS: {            treename: {                value: ''            }        }    });    Y.extend(TreeLoaderPlugin, Y.Plugin.Base, {        initializer: function() {            var tree = this.get(HOST);            this.onHostEvent('nodeClick', this._treenodeclick);            this.onHostEvent('nodeExpand', this._treenodeexpand);            var plugin = this;            var configuration = {                method: 'POST',                sync: true,                data: { name: this.get('treename') },                on: {                    complete: function(o) {                        var result = Y.JSON.parse(o.data.responseText);                        var treenode = new Y.TreeNode({ label: unescape(result.label), icon: result.iconCls, collapsed: true, nodeId: '-1', expandable: true });                        treenode.handler = unescape(result.handler);                        treenode.dataRefresh = result.expandRefresh == true;                        treenode.dataRead = false;                        treenode.dataID = "";                        tree.add(treenode);                        plugin._loadsub(treenode);                    }                }            };            var rio = new Y.IO({ emitFacade: true, bubbles: true });            rio.send('../Tree/Get', configuration);        },        _treenodeclick: function(e) {            if (e.treenode.handler != '') {                eval(e.treenode.handler);            }        },        _treenodeexpand: function(e) {            this._loadsub(e.treenode);        },        _loadsub: function(node) {            if (node.dataRefresh == true || node.dataRead == false) {                if (node.dataRead && node.size() > 0) {                    while (node.size() > 0) {                        node.item(0).remove();                    }                }                node.dataRead = true;                var configuration = {                    method: 'POST',                    sync: true,                    data: { name: this.get('treename'), id: node.get('nodeId'), dataID: node.dataID },                    on: {                        complete: function(o) {                            var list = eval(o.data.responseText);                            for (var n = 0; n < list.length; n++) {                                k = list[n];                                var treenode = new Y.TreeNode({ label: unescape(k.label), icon: k.iconCls, collapsed: k.autoExpand == true, nodeId: k.id, expandable: k.hasChild });                                treenode.handler = unescape(k.handler);                                treenode.nodeID = k.id;                                treenode.dataRead = false;                                if (k.dataID != null) {                                    treenode.dataID = k.dataID;                                }                                else {                                    treenode.dataID = "";                                }                                treenode.dataRefresh = k.expandRefresh == true;                                node.add(treenode);                            }                        }                    }                };                var rio = new Y.IO({ emitFacade: true, bubbles: true });                rio.send('../Tree/GetChild', configuration);            }        }    });    Y.namespace('TreePlugin');    Y.TreePlugin.TreeLoaderPlugin = TreeLoaderPlugin;

这个plugin通过后台获取树的配置信息并生成树,关于树的后台是如何实现的,这里就不解释了,可以参考ExtFrame相关的架构说明页面

plugin通过Host的nodeClick方法,执行节点上定义的操作,通过Host的nodeExpand方法,拦截节点展开事件,判断节点如果已获取数据,且为非刷新节点,则不响应,如未获取数据,或为每次展开重新刷新节点,则删除子节点并重新加载

 

转载于:https://www.cnblogs.com/zuxOK/archive/2012/12/04/2800988.html

你可能感兴趣的文章
MTK笔记
查看>>
ERROR: duplicate key value violates unique constraint "xxx"
查看>>
激活office 365 的启动文件
查看>>
无法根据中文查找
查看>>
[简讯]phpMyAdmin项目已迁移至GitHub
查看>>
转载 python多重继承C3算法
查看>>
【题解】 bzoj1597: [Usaco2008 Mar]土地购买 (动态规划+斜率优化)
查看>>
css文本溢出显示省略号
查看>>
git安装和简单配置
查看>>
面向对象:反射,双下方法
查看>>
鼠标悬停提示文本消息最简单的做法
查看>>
课后作业-阅读任务-阅读提问-2
查看>>
面向对象设计中private,public,protected的访问控制原则及静态代码块的初始化顺序...
查看>>
fat32转ntfs ,Win7系统提示对于目标文件系统文件过大解决教程
查看>>
Awesome Adb——一份超全超详细的 ADB 用法大全
查看>>
shell cat 合并文件,合并数据库sql文件
查看>>
Android 将drawable下的图片转换成bitmap、Drawable
查看>>
介绍Win7 win8 上Java环境的配置
查看>>
移动、联通和电信,哪家的宽带好,看完你就知道该怎么选了!
查看>>
Linux设置环境变量的方法
查看>>