本例提供了树节点的各种常用操作:
- 有针对当前树的遍历,查询和定位
- 树节点的增加和删除
- 树节点的移动
遍历说明
树遍历范例代码:
function dosomething(nodes) { nodes.each(function(node) { dosomething(node.get("nodes")); }); } dosomething(view.get("#treeGrid.nodes"));
遍历代码应用技巧一(展开所有节点):
function expand(nodes) { nodes.each(function(node) { if (!node.get("expanded")) node.expand(); expand(node.get("nodes")); }); } expand(view.get("#treeGrid.nodes"));
遍历代码应用技巧二(收缩所有节点):
function collapse(nodes) { nodes.each(function(node) { collapse(node.get("nodes")); if (node.get("expanded")) node.collapse(); }); } collapse(view.get("#treeGrid.nodes"));
遍历代码应用技巧三(全部选中):
function select(nodes) { nodes.each(function(node) { select(node.get("nodes")); node.set("checked", true); }); } select(view.get("#treeGrid.nodes"));
遍历代码应用技巧四(全部取消选中):
function unselect(nodes) { nodes.each(function(node) { unselect(node.get("nodes")); node.set("checked", false); }); } unselect(view.get("#treeGrid.nodes"));
遍历代码应用技巧五(获得所有选中节点):
var nodes = view.get("#treeGrid").getCheckedNodes(), message; if (nodes && nodes.length) { var names = []; nodes.each(function(data){ names.push(data.get("data.firstName")); }); message = names.join("\n"); } else { message = "未选中任何节点!"; } dorado.MessageBox.alert(message);
添加删除节点
在Dorado中新增或删除树节点不再需要调用很复杂的Tree相关的api,一般情况下我们只要针对实体对象操作就可以,如删除节点(remove方法):
var currentEntity = view.get("#treeGrid.currentEntity"); currentEntity.remove();
添加节点(createChild方法):
var currentNode = view.get("#treeGrid.currentNode"); var currentEntity = currentNode.get("data"); currentNode.expandAsync(function() { currentEntity.createChild("underlings", { firstName: "First Name", lastName: "Last Name" }); });
其中underlings是立体数据模型相对currentEntity中的一个子属性,如下图:
上面代码的意思就是给Employee的underlings添加一个子对象。
默认添加的子对象的位置如下(Steven添加子对象后,子对象处于所有子对象的最后一个位置)
如果希望对插入节点进行相对位置设定,例如希望插入节点处于第一个位置,则可以在insert方法中添加"begin"参数:
var currentNode = view.get("#treeGrid.currentNode"); var currentEntity = currentNode.get("data"); currentNode.expandAsync(function() { currentEntity.get("underlings").insert({ firstName: "First Name", lastName: "Last Name" }, "begin"); });
那么新增节点的位置效果就如下图:
添加同级节点(用createBrother方法):
var currentNode = view.get("#treeGrid.currentNode"); var currentEntity = currentNode.get("data"); currentEntity.createBrother({ firstName: "First Name", lastName: "Last Name" });
如果选择Steven,再用createBrother方法添加节点的效果如图:
也可以指定位置插入节点,如在当前节点的前面插入同级节点:
var currentNode = view.get("#treeGrid.currentNode"); var currentEntity = currentNode.get("data"); currentEntity.parent.insert({ firstName: "<First Name>", lastName: "<Last Name>", }, "before", currentEntity);
这儿采用了before参数,并提供了refEntity相对参照实体对象,这样新增的实体对象就添加到Steven的上面。
关于insert的详细说明,可以参考client-api,截图:
insert方法还可以进行树的节点移动,参考下面的内容
树的节点移动
另外也可以很方便的实现树的节点移动,如下的Anne节点
我们希望将Anne节点移动到Robert的上面,效果如下:
那么我们就可以通过如下代码实现:
var currentEntity = view.get("#treeGrid.currentNode.data"); var previous = currentEntity.getPrevious(); currentEntity.parent.insert(currentEntity, "before", previous);
同样也支持向下的节点移动,如下Anne再移动到Robert下面:
实现代码:
var currentEntity = view.get("#treeGrid.currentNode.data"); var next = currentEntity.getNext(); currentEntity.parent.insert(currentEntity, "after", next);
上面的几个范例都是节点间平级的移动,如果希望在树的不同级别实现移动,如Anne移到与Steven相同级别的位置:
实现代码为:
var currentNode = view.get("#treeGrid.currentNode"); var currentEntity = currentNode.get("data"); var parentEntity = currentNode.get("parent.data"); parentEntity.parent.insert(currentEntity, "after", parentEntity);
Attachments:
image2012-6-15 9:37:29.png (image/png)
image2012-6-15 9:39:44.png (image/png)
image2012-6-15 9:43:3.png (image/png)
image2012-6-15 9:44:13.png (image/png)
image2012-6-15 9:53:7.png (image/png)
image2012-6-15 9:56:16.png (image/png)
image2012-6-15 10:9:25.png (image/png)
image2012-6-15 10:10:14.png (image/png)
image2012-6-15 10:11:24.png (image/png)
image2020-5-10 10:23:53.png (image/png)
image2020-5-10 10:25:32.png (image/png)
image2020-5-10 10:26:36.png (image/png)
image2020-5-10 10:28:7.png (image/png)
image2020-5-10 10:31:13.png (image/png)
image2020-5-10 10:32:3.png (image/png)
image2020-5-10 10:35:3.png (image/png)