对树进行一些操作的后台是Controller类。而RpcController能够以RPC的方式,Json数据传递的方式将前端和后台进行结合。
我们可以查看原代码知道 TreeRPCController 继承于TreeLoadingController,而TreeLoadingController继承于TreeBasicController,TreeBasicController继承HtmlWidget。
我们先对TreeBasicController进行分析:
1:DNDController属性,如果该属性为“create",那么该Controller就具有拖动的功能。
if (this.DNDController == "create") {
???dojo.require("dojo.dnd.TreeDragAndDrop");
???this.DNDController = new dojo.dnd.TreeDNDController(this);
??}
2:dieWithTree:表示当树Destroy,Controller是否同时Destroy。
3:listenTree:将Controller绑定Tree的4个事件,如果DNDController存在,也同时绑定Tree的时间。
createDOMNode,treeClick,treeCreate,treeDestroy。
比如:两个绑定的原代码:
onCreateDOMNode: function(message) {
??var node = message.source;
??if (node.expandLevel > 0) {
???this.expandToLevel(node, node.expandLevel);
??}
?},
?// perform actions-initializers for tree
?onTreeCreate: function(message) {
??var tree = message.source;
??var _this = this;
??if (tree.expandLevel) {
???dojo.lang.forEach(tree.children,
????function(child) {
?????_this.expandToLevel(child, tree.expandLevel-1)
????}
???);
??}
?},
4:改controller还提供了canMove,canRemoveNode,canCreateChild等方法判断是否能够移动节点,删除节点和创建子节点。移动节点的方法是move,在move方法体里面,首先调用canMove,判断是否能够移动,然后是调用doMove方法执行具体的移动,move方法返回true或false。其它删除和创建同理。
三个方法签名如下:
move: function(child, newParent, index)
removeNode: function(node, callObj, callFunc)
createChild: function(parent, index, data, callObj, callFunc)
未完...