前端之家收集整理的这篇文章主要介绍了
xmlplus组件设计系列之树(Tree)(9),
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_404_0@树形组件是一种具有层级结构的组件,广泛应用于各种场景。本章会实现一个简单的树形组件,尽管功能有限,但你可以通过扩展它来实现自己所需要的树形组件。
@H_
404_0@

@H_
404_0@
数据源
@H_
404_0@树形组件的数据源可以是 JSON 格式的数据对象,也可以是具有 XML 结构的数据或者是其它的具有层级结构的数据。本章将采用具有如下 JSON 格式的数据对象。
@H_
404_0@上述数据源中,name 值会作为树结点的
名称显示,含 children 的数组代表节点的子级。
@H_
404_0@
递归结构的设计
@H_
404_0@由 HTML 中的列表元素 ul 以及 li 组合而成对象具有天然的树形结构,我们不妨采用它们作为构建树形组件的基本元素。树形组件的最外层必然是一个 ul 元素,所以我们可以暂时定义树形组件如下:
`
}
@H_
404_0@这里的未定义的组件 Item 是一个需要递归定义的子项组件,它会根据提供的数据递归地
生成子孙对象。下面是一种可能的设计:
`,map: { defer: "entries" }
}
@H_
404_0@注意,上面的 neme 对象是用于
显示 name
属性的。expand 对象用于展开或者
关闭子级对象 entries。子级对象 entries 被设置为需要延迟实例化,只有当
用户点击 expand 对象展开子级时,该对象才会实例化。
@H_
404_0@
数据的加载与渲染
@H_
404_0@如上一节所述,我们设定了子级对象 entries 需要延迟实例化。所以,在给子项 Item 提供的数据设置接口不应该立马对 entries 实例化。下面我们先给出数据接口
函数。
@H_
404_0@该接口
函数 val 只是设置了当前节点相关的
内容。下面我们来侦听 expand 对象的点击事件,并适时地完成组件对象 entries 的实例化。
@H_
404_0@上述
代码中包含一个 open 参数,该参数记录了当前节点的是否处于展开状态以供相关的侦听器使用。
@H_
404_0@
@H_
404_0@现在我们对上述组件进行一个小的扩展,使得它
支持动态
添加树节点的
功能。首先,我们在对象 entries 的子级
添加一个触发按钮,并命名为 add。
",map: { defer: "entries" }
}
@H_
404_0@其次,需要侦听 add 对象的点击事件,在侦听器中完成对象的
添加。
代码同前
}
}
@H_
404_0@这里需要注意,对 add 对象的侦听不能采取直接式的侦听:sys.add.on("click",...),而应该使用代理的方式,否则会报错。因为其父级属于延迟实例化的组件,在 entries 对象未实例化之间,add 对象并不可见。
@H_
404_0@
完整的树形组件
@H_
404_0@综合以上的
内容,现在给出一个完整版本的树形组件:
`,fun: function (sys,opts) {
return items.item;
}
},Item: {
css: "#item { cursor: pointer; }",xml: `
`,map: { defer: "entries" },function () {
var stuff = {name: 'new stuff'};
data.children.push(stuff);
sys.add.before("Item").value().val(stuff);
});
sys.expand.on("click",function () {
open = !open;
sys.expand.text(open ? " [-]" : " [+]");
open ? (sys.entries.show() && load()) : sys.entries.hide();
});
function load() {
if ( sys.entries.children().length == 1 )
for ( var item of data.children )
sys.add.before("Item").value().val(item);
}
function val(value) {
data = value;
sys.neme.text(data.name);
data.children && data.children.length && sys.expand.show().text(" [+]");
}
return { val: val };
}
}
@H_
404_0@在实际应用中的树形组件会比这里的
功能更丰富些,你可以在上述
代码的基础上进一步的改进,比如
添加些 ICON 图标、让子项成为可拖动的等等。但在改进过程中尽量避免
代码的复杂化,适当地剥离些
代码出来封装成组件是非常有必要的。
@H_
404_0@本系列
文章基于 xmlplus 框架。如果你对 xmlplus 没有多少了解,可以访问
nofollow" href="http://www.xmlplus.cn">www.xmlplus.cn。这里有详尽的入门文档可供参考。
@H_
404_0@以上就是本文的全部
内容,希望对大家的学习有所帮助,也希望大家多多
支持编程之家。