`
ruruhuang
  • 浏览: 193695 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Dojo TreeV3使用详解

阅读更多

Dojo TreeV3使用详解

                                              作者:邓胤(deng.yin@gmail.com)

    工作中使用了TreeV3这个dojo的组件,感觉基本上已经是把dojo的treeV3使用到了极点(自定义树的外观,树节点的拖拉,把其他Drag Source拖拉到树中),公司也要求我作个treeV3演说。所以特意把这篇文章写下来。

    首先先对treeV3做一个简单的介绍。TreeV3.js, TreeNodeV3.js, .TreeBasicControllerV3.js, TreeContextMenuV3.js,TreeDndControllerV3.js,TreeEditor.js, 主要的就是这些js一起协作。有兴趣的可以看看源码, 其实dojo的代码看起来还算是瞒简单的。下面我就用几个例子来说明怎样扩展或自定义TreeV3。本篇文章是增对有一定dojo知识的读者,如果你现在还不了解dojo,请看
http://dojotoolkit.org/.

    1.  为叶子节点增加图标。
       IconTree.html
      

   

       
childIconSrc="images/page.gif" title="Item 1.1" widgetId="Item 1.1">

       
childIconSrc="images/page.gif" title="Item 1.2" widgetId="Item 1.2">

   


   

       
childIconSrc="images/page.gif" title="Item 2.1" widgetId="Item 2.1">

   


   

   
childIconSrc="images/page.gif" title="Item 4" widgetId="Item 4">


    我们在每个TreeNode上加上childIconSrc属性。请看icontree.js怎样让这个属性生效的。
    icontree.js
dojo.lang.extend(dojo.widget.TreeNodeV3, {
    childIconsrc: "",
    childIcon: null,
    iconNode:null,
    titleNode:null,
    postCreate: function(args) {
    //build icon
        if (args["childIconsrc"]) {
            this.childIconsrc = args["childIconsrc"];
        }
        this.childIcon = document.createElement("img");
        if (this.childIconsrc != "") {
            this.childIcon.src = this.childIconsrc;
            this.childIcon.setAttribute("width", "16");
            this.childIcon.setAttribute("height", "16");
        }
        this.iconNode = this.tree.labelNodeTemplate.cloneNode(true);
        this.titleNode = this.tree.labelNodeTemplate.cloneNode(true);
        if (!this.isFolder){
            //clear treenode, if it is not folder node
            this.labelNode.innerHTML="";
        }
        this.titleNode.innerHTML=this.title;
        this.iconNode.appendChild(this.childIcon);
        // add icon first, then add title
        this.labelNode.appendChild(this.iconNode);
        this.labelNode.appendChild(this.titleNode);       
    }
});
我们扩展了TreeNodeV3这个组件的postCreate方法(dojo组件都有这个方法,他相当于构造方法吧,我们可以在这里做必要的初始化),这里做的事应该比较清楚,我们通过childIconsrc这个属性创建了iconNode,然后清空TreeNodeV3的labelNode。再增加iconNode和titleNode

2. 拖动物体到tree中
dragother.html
DndAcceptTypes="firstTree;feed" widgetId="firstTree" listeners="basicController;dndcontroller;selector;disableWrap" toggle="fade" showGrid="false" showRootGrid="true">
   

       

       

   


   

       

   


   

   






Drag me0 to tree.

Drag me1 to tree.

Drag me2 to tree.

You can&apost drag me.
注意黑体的DndAcceptTypes属性。说明这个树接受dragSource type为firstTree或者feed的(也就是自己,还有就是下面的span, 我们需要把span变成可以拖动的物体 dragSource)。再看dragother.js。
    dojo.addOnLoad(function(){
           var num = 0;
           while(dojo.byId("feed_" + num) != null){
               var dropSource = new dojo.dnd.HtmlDragSource(dojo.byId("feed_" + num), "feed");
               num++;
        }   
    });

dojo.dnd.TreeDropTargetV3.prototype.oldGetDropHandler = dojo.dnd.TreeDropTargetV3.prototype.getDropHandler;
dojo.lang.extend(dojo.dnd.TreeDropTargetV3, {
   
    getDropHandler: function(e, source, targetParent, targetIndex) {
        if (source.type == "feed"){
            var sourceNode = source.domNode;
            if (dojo.widget.byId(sourceNode.id) != null){
                alert("this widget has already been here.");
                return function(){
                    return false;
                }
            }            
            var node =createTreeNode(sourceNode.id, sourceNode.innerHTML);
            targetParent.addChild(node, targetIndex);
            return function(){
                return true;
            }
        }
        return this.oldGetDropHandler(e, source, targetParent, targetIndex);
    }   
});   

function createTreeNode(widgetId, title) {
    return dojo.widget.createWidget("TreeNodeV3",
    {
        widgetId: widgetId,                                                   
        title: title,
        isFolder: false,
        tree: &aposfirstTree&apos
    });
}

第一段是让那些span成为dragsource。第二段我们hack了dojo.dnd.TreeDropTargetV3的getDropHandler方法(具体可以看看TreeDndControllerV3.js)。当我们接收到dragSources时我们获取那些span中的一些信息,然后create 一个treeNode,在把这个treeNode加到树中。

3.   ...................................................
4.   ...................................................
5.   ...................................................

还有一些hack treeV3的东西实在不愿写。 dojo的treeV3真的是蛮强大的(仔细看看那几个**Controller和TreeV3 TreeNodeV3的源码), 而且dojo的widget源码还是蛮容易理解的。有兴趣的朋友可以看看dojo的源码。还有就是dojo包里面tests目录下面的例子。大多数应用的话看看里面的例子也就行了。

例子的源码可以在http://deng.yin.googlepages.com/TreeV3Sample.zip下载。本例子中没有包括dojo0.4源码,用户可以到http://download.dojotoolkit.org/release-0.4.0/dojo-0.4.0-ajax.zip下载源码, 然后解压到例子中的dojo目录。

格式不好的话可以看http://docs.google.com/View?docid=ajgd3tgv958v_3gz374h
分享到:
评论

相关推荐

    dojo Tree数据交互

    在dojo Tree中,可以使用`dijit.tree.ForestStoreModel`或`dijit.tree.model`等模型来处理节点的移动操作。通常,这涉及到调用`move`方法,传入要移动的节点、目标父节点以及在目标节点下的插入位置。 另一份文件...

    dojo动态tree

    5. **可扩展性**:Dojo Tree可以与其他Dojo组件无缝集成,如dijit.form.Form、dijit.Dialog等,也可以与非Dojo的JavaScript库配合使用。 ### 动态加载 动态加载是Dojo Tree的一个关键特性。它通过`dojo/store`模块...

    DOjo中文使用手册

    DOjo提供了许多高级功能,如树(Tree)、数据Grid、图表等。这些功能可以帮助用户快速构建复杂的Web应用程序。 Dojox扩展包 Dojox是DOjo的一个扩展包,提供了许多有用的功能,如 CometD、图表、数据Grid等。Dojox...

    dojo任意级树的节点转移

    3. **API调用**:Dojo Tree提供了API来处理节点操作,如`move`、`addChild`、`removeChild`等。在节点转移时,我们需要调用这些API来修改树的结构。例如,如果要将一个节点移动到另一个节点下,可能需要先移除原始...

    struts2-dojo-tree各种实例

    Struts2 Dojo Tree 是一个基于Struts2框架和Dojo JavaScript库的组件,用于在Web应用程序中创建可交互的树形视图。这个组件允许用户以图形化的方式浏览和操作层次结构数据,例如文件系统、组织结构或者数据库中的...

    Dojo框架使用教程

    本教程将深入探讨Dojo框架的使用,帮助开发者更好地理解和应用这一工具。 首先,从`dojo-release-0.9.0.tar.gz`这个文件名可以看出,这是一个Dojo框架的早期版本,版本号为0.9.0。在学习过程中,了解不同版本间的...

    DOJO详解(包括详细的例子)

    **DOJO详解** DOJO,全称为Dojo Toolkit,是一个强大的JavaScript库,旨在简化Web开发。这个开源工具包提供了一整套解决方案,包括UI组件、数据管理、动画效果、Ajax交互以及模块化开发等,使得开发者能够高效地...

    dojo dojo实例 dojo例子 dojo资料 dojo项目 dojo实战 dojo模块 dojo编程

    3. **dojo/ready**:这个模块用于确保DOM加载完成后再执行指定的函数,它是Dojo中的一个实用工具,常用于页面初始化。 4. **dojo/store**:这是一个数据存储抽象层,提供了一种统一的方式来访问和操作数据,无论...

    dojo精品中文教程(包一)

    Dojo学习笔记--dijit.Tree Dojo学习笔记--dojo.graphics.color & dojo.uri.Uri Dojo学习笔记--dojo.string & dojo.lang Dojo学习笔记--动态生成widget Dojo学习笔记--开发自己的TitlePane Dojo学习笔记--页面...

    dojo精品中文教程(包二)

    Dojo学习笔记--dijit.Tree Dojo学习笔记--dojo.graphics.color & dojo.uri.Uri Dojo学习笔记--dojo.string & dojo.lang Dojo学习笔记--动态生成widget Dojo学习笔记--开发自己的TitlePane Dojo学习笔记--页面...

    dojo 1.9 Tutorials(使用说明)

    3. **dojo/ready**: 用于在DOM准备就绪或页面完全加载后执行指定的函数,是Dojo中的一个重要概念,确保在执行代码时,DOM已经完全构建完毕。 4. **dojo/store**: 提供了一种数据存储抽象,允许与不同类型的后台数据...

    dojo精品中文教程(全)

    Dojo学习笔记--dijit.Tree Dojo学习笔记--dojo.graphics.color & dojo.uri.Uri Dojo学习笔记--dojo.string & dojo.lang Dojo学习笔记--动态生成widget Dojo学习笔记--开发自己的TitlePane Dojo学习笔记--页面...

    基于dojo的动态树

    【基于Dojo的动态树】是一种使用JavaScript库Dojo Toolkit创建的交互式树形结构,常用于展现层次化的数据或导航菜单。Dojo Toolkit是一个功能强大的JavaScript库,它提供了多种UI组件,包括Tree组件,可以方便地在...

    Dojo基础3国际化

    3. 定义语言模块:在`language.js`中使用`dojo.provide()`声明模块。 4. 界面配置与使用:通过`dojo.require()`导入`dojo.i18n`模块,然后注册模块路径,导入语言模块,并使用`dojo.requireLocalization()`加载所需...

    DojoAPI V1.9文档及实例

    Dojo API V1.9是Dojo Toolkit的一个关键版本,这个框架主要用于构建高性能的JavaScript应用程序。Dojo Toolkit是一个全面的JavaScript库,包含了丰富的组件、工具和功能,支持跨浏览器兼容性,提供模块化开发,以及...

    dojo文档 dojo文档 dojo文档

    dojo文档 dojo文档 dojo文档 dojo文档 dojo文档 dojo文档 dojo文档 dojo文档 dojo文档 dojo文档 dojo文档 dojo文档

    dojo树实例

    3. **配置树模型**:使用`dijit/tree/ForestStoreModel`来建立数据模型,将数据存储与树结构关联。 ```javascript var model = new dijit.tree.ForestStoreModel({ store: store, rootId: "root", rootLabel: ...

    DOJO 学习笔记 dojo

    在 Dojo 中,使用 `dojo.require` 来声明所需的模块和包,类似于其他编程语言中的导入或使用语句。 `djConfig` 是 Dojo 的全局配置对象,允许你在页面加载前设置 Dojo 的行为。例如,`isDebug` 属性可以设置为 `...

    dojo控件的使用和入门心得

    ### Dojo控件的使用和入门心得 #### Dojo简介及其优势 Dojo是一个功能强大的JavaScript框架,专门设计用于简化富互联网应用(RIA)的开发。作为一种DHTML Toolkit,Dojo封装了大量的常用功能,旨在提高前端开发...

    Dojo3.rarDojo3.rarDojo3.rarDojo3.rar

    【标题】:Dojo3,一个强大的JavaScript框架详解 【描述】:Dojo3是一个功能丰富的JavaScript库,专为构建高性能、跨平台的Web应用程序而设计。它提供了大量的工具、API和模块,帮助开发者实现复杂的功能,如数据...

Global site tag (gtag.js) - Google Analytics