感谢reedseutozte的投稿,一篇关于dijit.Tree的使用方法介绍,非常好的文章,也很能体现出Dojo的核心设计思想。作为最常用的一个控件,相信这篇文章能帮助到很多同学。再次感谢reedseutozte,为Dojo中文博客带来了第一篇投稿文章:)
概述
Dojo的dijit.tree的代码结构完全遵循MVC结构,结构非常严谨:网上关于tree 的资料根多,而且dojo自身也提供了丰富的样例,这里介绍一些其样例中没有涉及的一些用法。
var treeModel = new dijit.tree.ForestMode({ ....... }); treeModel.mayHaveChildren = function(item) { //item为对应节点的数据项,该函数返回true表示该节点为非叶子节点,dojo就会为这个节点附着上非叶子图标 if(item.root) { return true; } else { //这里认为初始化树的时候对于每一个节点的数据项中都有type属性,根据属性判断 return (treeModel.store.getValue(item, 'type') != 'xxxx') } }
var oldExpand = dijit.Tree.prototype._onExpandoClick; dojo.extend(dijit.Tree, { _onExpandoClick: function(message) { var node = message.node; reloadNode(node); oldExpand.apply(this, arguments); } }); function reloadNode(node) { var store = node.tree.model.store; var nodeItem = node.item; //假设我们通过这个方法从后台取得了改node的子节点数据 var dataList = getChildList(); dojo.forEach(dataList, function(x){ ...... x.type = 'yyy'; //以上的代码可以看需要添加,上面一行代码的作用是可以通过store.getValue方法访问该节点对应的item的type属性 store.newItem(x,{parent:nodeItem, attribute: 'children'}); }); }
tree.model.store.setValue(node.item, 'name'/*取决于定义store时的label属性*/, newName)
tree.model.store.deleteItem(node.item)
tree.connect(tree, 'onClick', clickTreeNode); function clickTreeNode(item/*点中节点对应的数据项*/, node/*点中的对象,这里node.item就是的第一个参数*/,evt/*事件*/) { ................ }
dojo.connect(pMenu, '_openMyself', function(e){ var node = dijit.getEnclosingWidget(e.target); /*node就是节点对象*/ });
tree.dndController.setSelection([node])
dojo.connect(tree.dndController, 'onMouseDown', function(e){ //如果你的树上有滚动条,请加入如下代码,否则如果你选中了节点后拖动滚动条会出现节点拖拽精灵 if (dijit.getEnclosingWidget(e.target) == tree) { tree.dndController.mousedown = false; return; } //tree.dndController.mousedown为true表示允许拖拽,反之就是不允许,e为鼠标事件对象 //tree的selectedNodes属性可以返回选中的节点列表,这里的代码表示每个选中节点的数据项中的type属性都是xxx才能拖动 tree.dndController.mousedown = dojo.every(tree.selectedNodes, function(node){ return (tree.model.store.getValue(node.item, 'type') == 'xxx') }); });
tree.checkItemAcceptance = function(target, source, position) { //target: DomNode 目标节点对应的dom, 用dijit.getEnclosingWidget(target)可以获得TreeNode对象 //source: dijit.tree.dndSource 被拖动的treeNode对象,是一个列表,因为tree允许一次拖动多个节点 //position: 'over', 'before', 'after' //返回true表示允许drop }