﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-不做浮躁的人-随笔分类-dojo</title><link>http://www.blogjava.net/bjwulin/category/17593.html</link><description>java希望,我的世界</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 04:28:06 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 04:28:06 GMT</pubDate><ttl>60</ttl><item><title>dojo tree：program create tree</title><link>http://www.blogjava.net/bjwulin/archive/2006/11/24/83153.html</link><dc:creator>不做浮躁的人</dc:creator><author>不做浮躁的人</author><pubDate>Thu, 23 Nov 2006 18:42:00 GMT</pubDate><guid>http://www.blogjava.net/bjwulin/archive/2006/11/24/83153.html</guid><wfw:comment>http://www.blogjava.net/bjwulin/comments/83153.html</wfw:comment><comments>http://www.blogjava.net/bjwulin/archive/2006/11/24/83153.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bjwulin/comments/commentRss/83153.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bjwulin/services/trackbacks/83153.html</trackback:ping><description><![CDATA[
		<p>主要使用他做带有复选框的树，一次性从数据库得到数据，产生js代码，送到浏览器执行。复选框可以直接写到标题里面，注意复选框的id命名规则，合理的命名可以处理一些操作（比如，取消上级，则取消所有下级）。最后就是对一次读取数据库可以采用路径发和封闭法一次性读取树的所有数据，避免递归方式。<br /><br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"<br />        "<a href="http://www.w3.org/TR/html4/strict.dtd">http://www.w3.org/TR/html4/strict.dtd</a>"&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;Dojo Tree Widget Test (dynamic node creation)&lt;/title&gt;</p>
		<p>&lt;script type="text/javascript"&gt;<br /> var djConfig = {isDebug: true, debugAtAllCosts: true };<br />&lt;/script&gt;<br />&lt;script type="text/javascript" src="../../../dojo.js"&gt;&lt;/script&gt;<br />&lt;script type="text/javascript"&gt;</p>
		<p> dojo.require("dojo.widget.*");<br /> dojo.require("dojo.widget.TreeV3");<br /> dojo.require("dojo.widget.TreeNodeV3");<br /> dojo.require("dojo.widget.TreeBasicControllerV3");<br /> dojo.hostenv.writeIncludes();<br />&lt;/script&gt;<br />&lt;script type="text/javascript"&gt;</p>
		<p> dojo.addOnLoad(function(){</p>
		<p>  var controller = dojo.widget.createWidget("TreeBasicControllerV3");  <br />  var tree = dojo.widget.createWidget("TreeV3", {listeners:[controller.widgetId]});<br />  <br />  document.body.appendChild(tree.domNode);</p>
		<p>  var rootNode = dojo.widget.createWidget("TreeNodeV3", {title: "&lt;input type='checkbox' class='TreeIcon' /&gt;Root Node", tree: tree.widgetId});<br />  <br />  tree.addChild(rootNode);</p>
		<p>
				<br />  var node1 = dojo.widget.createWidget("TreeNodeV3", {title: "Node 1", tree: tree.widgetId});<br />  rootNode.addChild(node1);</p>
		<p>
				<br />  var node2 = dojo.widget.createWidget("TreeNodeV3", {title: "Node 1.2", tree: tree.widgetId});<br />  node1.addChild(node2, null, "after");</p>
		<p>
				<br />  rootNode.addChild(dojo.widget.createWidget("TreeNodeV3", {title: "Node 2", tree: tree.widgetId}));</p>
		<p>  var node3 = dojo.widget.createWidget("TreeNodeV3", {title: "Node 3&lt;br&gt;multiline", tree: tree.widgetId});<br />  rootNode.addChild(node3);<br />  var node3_1 = dojo.widget.createWidget("TreeNodeV3", {title: "Node 3.1", tree: tree.widgetId});<br />  node3.addChild(node3_1);<br />  node3_1.addChild(dojo.widget.createWidget("TreeNodeV3", {title: "Node 3.1.1", tree: tree.widgetId}))</p>
		<p>
				<br />  // Add some nodes the first element (rather than the last element) just for testing<br />  for(var i=1;i&lt;5;i++) {<br />   node1.addChild(dojo.widget.createWidget("TreeNodeV3", {title: "Node 1."+i, tree: tree.widgetId}));<br />  }</p>
		<p>  tree.addChild(dojo.widget.createWidget("TreeNodeV3", {title: "Root Node 2", tree: tree.widgetId}));</p>
		<p> });</p>
		<p>&lt;/script&gt;<br />&lt;/head&gt;<br />&lt;body&gt;</p>
		<p>&lt;h4&gt;Create tree programmatically&lt;/h4&gt;</p>
		<p>
				<br />&lt;/body&gt;<br />&lt;/html&gt;<br /></p>
<img src ="http://www.blogjava.net/bjwulin/aggbug/83153.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bjwulin/" target="_blank">不做浮躁的人</a> 2006-11-24 02:42 <a href="http://www.blogjava.net/bjwulin/archive/2006/11/24/83153.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dojo tree 代码汇总，基本上功能都全</title><link>http://www.blogjava.net/bjwulin/archive/2006/11/24/83152.html</link><dc:creator>不做浮躁的人</dc:creator><author>不做浮躁的人</author><pubDate>Thu, 23 Nov 2006 18:37:00 GMT</pubDate><guid>http://www.blogjava.net/bjwulin/archive/2006/11/24/83152.html</guid><wfw:comment>http://www.blogjava.net/bjwulin/comments/83152.html</wfw:comment><comments>http://www.blogjava.net/bjwulin/archive/2006/11/24/83152.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bjwulin/comments/commentRss/83152.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bjwulin/services/trackbacks/83152.html</trackback:ping><description><![CDATA[
		<p>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"<br />    "<a href="http://www.w3.org/TR/html4/loose.dtd">http://www.w3.org/TR/html4/loose.dtd</a>"&gt;<br />&lt;html&gt;<br />    &lt;head&gt;<br />        &lt;title&gt;Untitled Document&lt;/title&gt;<br />        &lt;meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"&gt;<br />    <br />    &lt;script type="text/javascript"&gt;<br />        var djConfig = {isDebug: true, debugAtAllCosts: true };<br />    &lt;/script&gt;<br />    &lt;script type="text/javascript" src="../../../dojo.js"&gt;&lt;/script&gt;<br />    &lt;script type="text/javascript"&gt;<br />    <br />        dojo.require("dojo.widget.*");<br />        dojo.require("dojo.widget.TreeV3");<br />        dojo.require("dojo.widget.TreeNodeV3");<br />        dojo.require("dojo.widget.TreeBasicControllerV3");<br />        <br />        dojo.require("dojo.widget.TreeDocIconExtension");<br />        <br />         dojo.require("dojo.widget.TreeSelectorV3");<br />     dojo.require("dojo.widget.TreeEmphasizeOnSelect");<br />     dojo.require("dojo.widget.TreeExpandOnSelect");<br />     dojo.require("dojo.widget.TreeToggleOnSelect");<br />     <br />     //树的节点做超级连接。<br />     //加div以及在节点写object="href:http://...".<br />     dojo.require("dojo.widget.TreeLinkExtension");<br />     <br />     //内容不折行<br />     dojo.require("dojo.widget.TreeDisableWrapExtension");<br />     <br />     //拖动<br />     dojo.require("dojo.widget.TreeDndControllerV3");<br />     //上下文菜单<br />     dojo.require("dojo.widget.TreeContextMenuV3");<br />     //这个是用来绑定上下文菜单和controller事件的。需要扩展，缺少clone等方法。<br />     dojo.require("dojo.widget.TreeDemo");<br />     //菜单标签编辑器<br />     dojo.require("dojo.widget.TreeEditor");<br />     <br />     <br />        dojo.hostenv.writeIncludes();<br />    <br />      //两种结合方式<br />      //基于方法<br />      var selectAction = function() {    <br />         return function(message) {<br />             alert(message.node);<br />         } <br />      }<br />      //基于类<br />      <br />      var selectClass = function() {    <br />         this.go = function(message) {<br />            alert(message.node.widgetId);        <br />            alert(message.node.isFolder);<br />          }<br />      }<br />      <br />    <br />      dojo.addOnLoad(function(){</p>
		<p>    <br />        /* Add debug print for all controller events */<br />        var selector = dojo.widget.manager.getWidgetById('selector');<br />        //绑定消息的两种方式。<br />        //dojo.event.topic.subscribe(selector.eventNames['select'],selectAction());<br />        dojo.event.topic.subscribe(selector.eventNames['select'],new selectClass(),'go');<br />        <br />        //将上下文菜单和控制器进行绑顶。<br />        dojo.addOnLoad(function() { dojo.widget.TreeDemo.bindDemoMenu(dojo.widget.byId("controller")) });<br />   });<br />   <br />   //展开层次，注意回调接口。<br />   function testExpandToLevel(level) {<br />    var d = dojo.widget.byId('controller').expandToLevel(dojo.widget.byId('tree'),level);<br />    //dojo.widget.byId('treeController').expandToLevel(dojo.widget.byId('Item 1.3'),3)<br />    //d.addCallback(function() { alert('done') });<br />   }<br />   //添加新的节点<br />   function testCreate() {<br />    var d = dojo.widget.byId('controller').createChild(dojo.widget.byId('Item 1'),1,{title:'tttttttttttttttttttttttttttttttttttttttt'});  <br />    //d.addCallbacks(printOk, printErr);<br />   }<br />   <br />   //编辑节点。<br />   function testEdit() {<br />    dojo.widget.byId('controller').editLabelStart(dojo.widget.byId('Item 1'));<br />   }<br />      <br />   //节点的contentClass可以改变标题内容。<br />   //TreeDocIconExtension：在每个项上加图标。改变docIcon的class。</p>
		<p>    &lt;/script&gt;<br />    &lt;style&gt;<br />        .myCssClass {<br />      font-family: Arial, Helvetica, sans-serif;<br />            font-size: 18px;<br />        }<br />    &lt;/style&gt;<br />    &lt;/head&gt;<br />    &lt;body&gt;<br />        &lt;div dojoType="TreeEditor" widgetId="editor"&gt;&lt;/div&gt;<br />        <br />        &lt;div dojoType="TreeDocIconExtension" widgetId="docIcons"&gt;&lt;/div&gt;<br />        &lt;div dojoType="TreeBasicControllerV3" widgetId="controller" editor="editor"&gt;&lt;/div&gt;<br />        <br />        &lt;div dojoType="TreeSelectorV3" allowedMulti="false" widgetId="selector"&gt;&lt;/div&gt; <br />    &lt;div dojoType="TreeEmphasizeOnSelect" selector="selector"&gt;&lt;/div&gt;<br />    <br />    &lt;div dojoType="TreeExpandToNodeOnSelect" selector="selector" controller="controller"&gt;&lt;/div&gt;    <br />    &lt;div dojoType="TreeToggleOnSelect" selector="selector" selectEvent="dblselect" controller="controller"&gt;&lt;/div&gt;<br />    <br />    &lt;div dojoType="TreeLinkExtension" widgetId="link" params="target:_blank"&gt;&lt;/div&gt; <br />        <br />        &lt;div dojoType="TreeDisableWrapExtension" widgetId="disableWrap"&gt;&lt;/div&gt;<br />    <br />    &lt;div dojoType="TreeDndControllerV3" controller="controller" widgetId="dndcontroller"&gt;&lt;/div&gt;<br />    <br />        &lt;div dojoType="TreeContextMenuV3" toggle="explode" contextMenuForWindow="false" widgetId="contextMenu"&gt;<br />     &lt;div dojoType="TreeMenuItemV3" treeActions="addChild" iconSrc="../images/createsmall.gif" widgetId="treeContextMenuCreate" caption="Create"&gt;&lt;/div&gt;<br />     &lt;div dojoType="TreeMenuItemV3" treeActions="remove" iconSrc="../images/removesmall.gif" caption="Remove" widgetId="treeContextMenuDestroy"&gt;&lt;/div&gt;<br />     &lt;div dojoType="TreeMenuItemV3" treeActions="move" iconSrc="../images/downsmall.png" caption="Up" widgetId="treeContextMenuUp"&gt;&lt;/div&gt;<br />     &lt;div dojoType="TreeMenuItemV3" treeActions="move" iconSrc="../images/upsmall.png" caption="Down" widgetId="treeContextMenuDown"&gt;&lt;/div&gt;<br />    &lt;/div&gt;<br />        <br />        &lt;!-- 增加DND功能，在tree div中增加DndMode="between;onto" DndAcceptTypes="tree"--&gt;<br />        &lt;div dojoType="TreeV3" DndMode="between;onto" DndAcceptTypes="tree" listeners="controller;docIcons;selector;link;disableWrap;contextMenu;dndcontroller" widgetId="tree"&gt;<br />            &lt;div dojoType="TreeNodeV3" title="Item 1" object="href:http://news.sina.com.cn" widgetId="Item 1" contentClass="myCssClass"&gt;<br />                &lt;div dojoType="TreeNodeV3" title="Item 1.1" widgetId="Item 1.1" contentClass="myCssClass"&gt;&lt;/div&gt;<br />                &lt;div dojoType="TreeNodeV3" title="Item 1.2" widgetId="Item 1.2" contentClass="myCssClass"&gt;&lt;/div&gt;<br />                &lt;div dojoType="TreeNodeV3" title="Item 1.3" widgetId="Item 1.3" contentClass="myCssClass"&gt;<br />                    &lt;div dojoType="TreeNodeV3" title="Item 1.3.1" widgetId="Item 1.3.1" contentClass="myCssClass"&gt;&lt;/div&gt;<br />                    &lt;div dojoType="TreeNodeV3" title="Item 1.3.2" widgetId="Item 1.3.2" contentClass="myCssClass"&gt;<br />                        &lt;div dojoType="TreeNodeV3" title="Item 1.3.2.1" widgetId="Item 1.3.2.1" contentClass="myCssClass"&gt;&lt;/div&gt;<br />                        &lt;div dojoType="TreeNodeV3" title="Item 1.3.3.2" widgetId="Item 1.3.3.2" contentClass="myCssClass"&gt;<br />                            &lt;div dojoType="TreeNodeV3" title="Item 1.3.3.2.1" widgetId="Item 1.3.3.2.1" contentClass="myCssClass"&gt;&lt;/div&gt;<br />                        &lt;/div&gt;<br />                    &lt;/div&gt;<br />                &lt;/div&gt;<br />            &lt;/div&gt;<br />            &lt;!-- node有actionsDisabled 属性--&gt;<br />            &lt;div dojoType="TreeNodeV3" actionsDisabled="MOVE" title="Can't move this node"&gt;&lt;/div&gt;<br />            &lt;div dojoType="TreeNodeV3" actionsDisabled="ADDCHILD" title="Can't add child this node"&gt;&lt;/div&gt;<br />        &lt;/div&gt;<br />        <br />        <br />      <br />   <br />   <br />   &lt;div style="display:none"&gt;<br />    &lt;!-- IE has a bug: it reloads all dynamically resolved images, no matter, is it<br />    new Image() or CSS background. If you don't specify images like that,<br />    it will reload them every time a node is expanded --&gt;<br />    &lt;img src="../../../src/widget/templates/images/TreeV3/i.gif"&gt;<br />    &lt;img src="../../../src/widget/templates/images/TreeV3/i_half.gif"&gt;<br />    &lt;img src="../../../src/widget/templates/images/TreeV3/expand_minus.gif"&gt;<br />    &lt;img src="../../../src/widget/templates/images/TreeV3/expand_plus.gif"&gt;<br />    &lt;img src="../../../src/widget/templates/images/TreeV3/expand_leaf.gif"&gt;<br />    &lt;img src="../../../src/widget/templates/images/TreeV3/i_long.gif"&gt;<br />    &lt;img src="../../../src/widget/templates/images/TreeV3/document.gif"&gt;<br />    &lt;img src="../../../src/widget/templates/images/TreeV3/open.gif"&gt;<br />    &lt;img src="../../../src/widget/templates/images/TreeV3/closed.gif"&gt;<br />   &lt;/div&gt; </p>
		<p>   <br />        <br />        &lt;!-- 直接选择一个节点,但是无法去掉已有的节点。 --&gt;<br />        &lt;input type="button" value="select Item 1" onClick="dojo.widget.byId('selector').select(dojo.widget.byId('Item 1'))"/&gt;<br />        &lt;input type="button" value="Expand to level 3" onClick="testExpandToLevel(100)"/&gt;<br />        &lt;input type="button" value="create new node" onClick="testCreate()"/&gt;<br />        &lt;input type="button" value="edit" onClick="testEdit()"/&gt;<br />    &lt;/body&gt;<br />&lt;/html&gt;<br /></p>
<img src ="http://www.blogjava.net/bjwulin/aggbug/83152.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bjwulin/" target="_blank">不做浮躁的人</a> 2006-11-24 02:37 <a href="http://www.blogjava.net/bjwulin/archive/2006/11/24/83152.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dojoTree TreeSelector</title><link>http://www.blogjava.net/bjwulin/archive/2006/11/22/82918.html</link><dc:creator>不做浮躁的人</dc:creator><author>不做浮躁的人</author><pubDate>Wed, 22 Nov 2006 15:47:00 GMT</pubDate><guid>http://www.blogjava.net/bjwulin/archive/2006/11/22/82918.html</guid><wfw:comment>http://www.blogjava.net/bjwulin/comments/82918.html</wfw:comment><comments>http://www.blogjava.net/bjwulin/archive/2006/11/22/82918.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bjwulin/comments/commentRss/82918.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bjwulin/services/trackbacks/82918.html</trackback:ping><description><![CDATA[
		<p>TreeSelector继承于HtmlWidget，其作用主要是处理Tree的Select的功能。<br />1：具有selectedNode的属性<br />2：默认的事件名有：<br />eventNamesDefault: {<br />  select : "select",<br />  destroy : "destroy",<br />  deselect : "deselect",<br />  dblselect: "dblselect" // select already selected node.. Edit or whatever<br /> },<br />3：注意这段代码：eventNames的值。<br />initialize: function() {</p>
		<p>  for(name in this.eventNamesDefault) {<br />   if (dojo.lang.isUndefined(this.eventNames[name])) {<br />    this.eventNames[name] = this.widgetId+"/"+this.eventNamesDefault[name];<br />   }<br />  }</p>
		<p> },<br />4：监听树的事件：<br />listenTree: function(tree) {<br />  //标题和图标的click都绑定到Selector的select事件。<br />  dojo.event.topic.subscribe(tree.eventNames.titleClick, this, "select");<br />  dojo.event.topic.subscribe(tree.eventNames.iconClick, this, "select");<br /><br />  dojo.event.topic.subscribe(tree.eventNames.collapse, this, "onCollapse");<br />  dojo.event.topic.subscribe(tree.eventNames.moveFrom, this, "onMoveFrom");<br />  dojo.event.topic.subscribe(tree.eventNames.removeNode, this, "onRemoveNode");<br />  dojo.event.topic.subscribe(tree.eventNames.treeDestroy, this, "onTreeDestroy");</p>
		<p>  /* remember all my trees to deselect when element is movedFrom them */<br />  this.listenedTrees.push(tree);<br /> },<br /><br />5：</p>
<img src ="http://www.blogjava.net/bjwulin/aggbug/82918.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bjwulin/" target="_blank">不做浮躁的人</a> 2006-11-22 23:47 <a href="http://www.blogjava.net/bjwulin/archive/2006/11/22/82918.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dojoTree Controller(3) </title><link>http://www.blogjava.net/bjwulin/archive/2006/11/22/82914.html</link><dc:creator>不做浮躁的人</dc:creator><author>不做浮躁的人</author><pubDate>Wed, 22 Nov 2006 15:19:00 GMT</pubDate><guid>http://www.blogjava.net/bjwulin/archive/2006/11/22/82914.html</guid><wfw:comment>http://www.blogjava.net/bjwulin/comments/82914.html</wfw:comment><comments>http://www.blogjava.net/bjwulin/archive/2006/11/22/82914.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bjwulin/comments/commentRss/82914.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bjwulin/services/trackbacks/82914.html</trackback:ping><description><![CDATA[
		<p>接上面，继续讨论TreeRPCController。该类在TreeLoadingController上扩充了以下方法：<br />1：doMove的部分代码：<br />var params = {<br />   // 移动的节点以及节点所在的树<br />   child: this.getInfo(child),<br />   childTree: this.getInfo(child.tree),<br />   // 移动目的树，目的节点，以及目的位置。<br />   newParent: this.getInfo(newParent),<br />   newParentTree: this.getInfo(newParent.tree),<br />   newIndex: index<br />  };</p>
		<p>  var success;</p>
		<p>  this.runRPC({  <br />   url: this.getRPCUrl('move'),<br />   <br />   load: function(response){<br />    success = this.doMoveProcessResponse(response, child, newParent, index) ;<br />   },<br />   //同步处理<br />   sync: true,<br />   //锁定操作的两个节点。<br />   lock: [child, newParent],<br />   params: params<br />  });<br />2：doRemoveNode<br />   var params = {<br />   node: this.getInfo(node),<br />   tree: this.getInfo(node.tree)<br />  }</p>
		<p>  this.runRPC({<br />    url: this.getRPCUrl('removeNode'),<br />    load: function(response){<br />     this.doRemoveNodeProcessResponse(response, node, callObj, callFunc) <br />    },<br />    params: params,<br />    lock: [node]<br />  });<br /><br />3:doCreateChild<br />var params = {<br />    tree: this.getInfo(parent.tree),<br />    parent: this.getInfo(parent),<br />    index: index,<br />    data: output<br />   }</p>
		<p>   this.runRPC({<br />    url: this.getRPCUrl('createChild'),<br />    load: function(response) {<br />     // 建议采用死数据？<br />     this.doCreateChildProcessResponse( response, parent, index, callObj, callFunc) <br />    },<br />    params: params,<br />    lock: [parent]<br />   });</p>
<img src ="http://www.blogjava.net/bjwulin/aggbug/82914.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bjwulin/" target="_blank">不做浮躁的人</a> 2006-11-22 23:19 <a href="http://www.blogjava.net/bjwulin/archive/2006/11/22/82914.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dojoTree Controller(2) </title><link>http://www.blogjava.net/bjwulin/archive/2006/11/22/82913.html</link><dc:creator>不做浮躁的人</dc:creator><author>不做浮躁的人</author><pubDate>Wed, 22 Nov 2006 15:15:00 GMT</pubDate><guid>http://www.blogjava.net/bjwulin/archive/2006/11/22/82913.html</guid><wfw:comment>http://www.blogjava.net/bjwulin/comments/82913.html</wfw:comment><comments>http://www.blogjava.net/bjwulin/archive/2006/11/22/82913.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bjwulin/comments/commentRss/82913.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bjwulin/services/trackbacks/82913.html</trackback:ping><description><![CDATA[
		<p>我们接dojoTree Controller(1)继续讨论 TreeLoadingController<br />1：该类在TreeBasicController基础上增加了RPCUrl和RPCActionParam（默认为action）两个参数。解释这两个参数必须看下面的代码：<br />if (this.RPCUrl == "local") {<br />   var dir = document.location.href.substr(0, document.location.href.lastIndexOf('/'));<br />   var localUrl = dir+"/"+action;<br />   //dojo.debug(localUrl);<br />   return localUrl;<br />  }</p>
		<p>  if (!this.RPCUrl) {<br />   dojo.raise("Empty RPCUrl: can't load");<br />  }</p>
		<p>  return this.RPCUrl + ( this.RPCUrl.indexOf("?") &gt; -1 ? "&amp;" : "?") + this.RPCActionParam+"="+action;<br /><br />2：通用的错误处理器：<br />  RPCErrorHandler: function(type, obj, evt) {<br />  alert( "RPC Error: " + (obj.message||"no message"));<br /> },<br />可以自己定义处理方式。<br /><br />3：看以下runRPC的这段代码，就能明白服务器端该怎么处理请求：<br />dojo.io.bind({<br />   url: kw.url,<br />   /* I hitch to get this.loadOkHandler */<br />   handle: dojo.lang.hitch(this, handle),<br />   mimetype: "text/json",<br />   preventCache: true,<br />   sync: kw.sync,<br />   content: { data: dojo.json.serialize(kw.params) } <br />  });<br />4：loadRemote是动态装载该节点的子节点的方法，可以看看该方法的rpc部分：<br />var params = {<br />   node: this.getInfo(node),<br />   tree: this.getInfo(node.tree)<br />  };<br />dojo.io.bind({<br />   url: kw.url,<br />   /* I hitch to get this.loadOkHandler */<br />   handle: dojo.lang.hitch(this, handle),<br />   mimetype: "text/json",<br />   preventCache: true,<br />   sync: kw.sync,<br />   content: { data: dojo.json.serialize(kw.params) }<br />  });<br />5：相对TreeBasicController，该Controller还重写了doMove和doCreateChild方法。<br />doMove: function(child, newParent, index) {<br />  /* load nodes into newParent in sync mode, if needed, first */<br />  if (newParent.isTreeNode &amp;&amp; newParent.state == newParent.loadStates.UNCHECKED) {<br />   this.loadRemote(newParent, true);<br />  }</p>
		<p>  return dojo.widget.TreeBasicController.prototype.doMove.apply(this, arguments);<br /> },<br />可以看到是在同步处理完服务器的请求后，再执行的客户端操作。因此我们只要在服务器端处理添加新节点和移动节点时，只要返回true或false就可以了。<br /></p>
<img src ="http://www.blogjava.net/bjwulin/aggbug/82913.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bjwulin/" target="_blank">不做浮躁的人</a> 2006-11-22 23:15 <a href="http://www.blogjava.net/bjwulin/archive/2006/11/22/82913.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dojoTree Controller(1) </title><link>http://www.blogjava.net/bjwulin/archive/2006/11/22/82907.html</link><dc:creator>不做浮躁的人</dc:creator><author>不做浮躁的人</author><pubDate>Wed, 22 Nov 2006 14:36:00 GMT</pubDate><guid>http://www.blogjava.net/bjwulin/archive/2006/11/22/82907.html</guid><wfw:comment>http://www.blogjava.net/bjwulin/comments/82907.html</wfw:comment><comments>http://www.blogjava.net/bjwulin/archive/2006/11/22/82907.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bjwulin/comments/commentRss/82907.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bjwulin/services/trackbacks/82907.html</trackback:ping><description><![CDATA[
		<p>对树进行一些操作的后台是Controller类。而RpcController能够以RPC的方式，Json数据传递的方式将前端和后台进行结合。<br /><br />我们可以查看原代码知道 TreeRPCController 继承于TreeLoadingController，而TreeLoadingController继承于TreeBasicController，TreeBasicController继承HtmlWidget。<br /><br />我们先对TreeBasicController进行分析：<br />1：DNDController属性，如果该属性为“create"，那么该Controller就具有拖动的功能。<br />if (this.DNDController == "create") {<br />   dojo.require("dojo.dnd.TreeDragAndDrop");<br />   this.DNDController = new dojo.dnd.TreeDNDController(this);<br />  }<br /><br />2：dieWithTree：表示当树Destroy,Controller是否同时Destroy。<br />3：listenTree：将Controller绑定Tree的4个事件，如果DNDController存在，也同时绑定Tree的时间。<br />createDOMNode,treeClick,treeCreate,treeDestroy。<br />比如：两个绑定的原代码：<br />onCreateDOMNode: function(message) {</p>
		<p>  var node = message.source;</p>
		<p>
				<br />  if (node.expandLevel &gt; 0) {<br />   this.expandToLevel(node, node.expandLevel);<br />  }<br /> },</p>
		<p> // perform actions-initializers for tree<br /> onTreeCreate: function(message) {<br />  var tree = message.source;<br />  var _this = this;<br />  if (tree.expandLevel) {<br />   dojo.lang.forEach(tree.children,<br />    function(child) {<br />     _this.expandToLevel(child, tree.expandLevel-1)<br />    }<br />   );<br />  }<br /> },<br />4：改controller还提供了canMove，canRemoveNode,canCreateChild等方法判断是否能够移动节点，删除节点和创建子节点。移动节点的方法是move，在move方法体里面，首先调用canMove，判断是否能够移动，然后是调用doMove方法执行具体的移动，move方法返回true或false。其它删除和创建同理。<br />三个方法签名如下：<br />move: function(child, newParent, index)<br />removeNode: function(node, callObj, callFunc)<br />createChild: function(parent, index, data, callObj, callFunc)<br /><br /><br />未完...<br /><br /></p>
<img src ="http://www.blogjava.net/bjwulin/aggbug/82907.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bjwulin/" target="_blank">不做浮躁的人</a> 2006-11-22 22:36 <a href="http://www.blogjava.net/bjwulin/archive/2006/11/22/82907.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>