其实循环生成目录树这个方法不仅仅局限于在使用dojo的情况下,只要明白了其中的原理,在任何一种语言下都能动态循环生成。

1. 数据结构

在这里先说明一下数据结构,我这里循环生成目录树的数据结构是像这样的:

{

“rootName”:“根目录”, "id": 0, "isFolder": 1, "childRoot": [

“rootName”:“一级目录”, "id": 1,"isFolder": 1, "childRoot": [

“rootName”:“二级目录”, "id": 2,"isFolder": 1, "childRoot": [

"rootName": "子文件", "id": 3,"isFolder": 0, "childRoot": [],

"rootName": "子文件", "id": 4, "isFolder": 0, "childRoot": [],

"rootName": "子文件", "id": 5, "isFolder": 0, "childRoot": []

]

]

“rootName”:“一级目录”, "id": 6, "isFolder": 1, "childRoot": [

"rootName": "子文件", "id": 8, "isFolder": 0, "childRoot": [],

"rootName": "子文件", "id": 9, "isFolder": 0, "childRoot": [],

"rootName": "子文件", "id": 10,"isFolder": 0, "childRoot": []

]

“rootName”:“一级目录”, "id": 11,"isFolder": 1, "childRoot": [

]

]

}

当然,对于数据每个人都有不同的写法,这里最重要也是最值得关注的一点就是每一层的“childRoot”这个数组下还有没有数据存在,若是有的话则继续循环生成目录或文件,若是没有,则循环结束,继续下一轮的循环,直至结束。其中,rootName表示这一层的目录树名,"isFolder"用于判断这一层是文件夹还是文件,也可以通过"childRoot"的length来判断,我这里是为了简单调用,若是在不清楚文件有多少层的情况下,建议使用"childRoot"的length来判断所属。

2.html界面和js语法

 2.1 html界面

HTML界面没有什么需要过多阐述,因为是动态生成(并且我这边是在另外一个widgetx下依附的),所以直接添加一个div即可,如下:

    <div class="catalog-item" data-dojo-attach-point="catalogItem">

    </div>

  2.2 JS界面

    JS界面就只需要获取到HTML中定义的div,再在获取到的div下循环生成目录树即可。如下:

postCreate: function() {
this.inherited(arguments);
var ItemContent = this.catalogItem;
if(this.configData.length > 0){
//这里的configData是从上一层传过来的,也就是我们写在config里面数据,因为篇幅的关系,就不把那部分贴上来了。ItemContent也是获取到的div。
        this._createAccordionCatalog(this.configData, ItemContent);
} else {
alert("没有数据!");
} }, _createAccordionCatalog: function (datasource, parentContent) {
arrayUtil.forEach(datasource, function (itemData) {
if (!!Number(itemData.isGroup)) {
//有子元素则创建branch
this._createBranchCatalog(itemData, parentContent);
} else {
// 没有子元素则创建leaf
this._createLeafCatalog(itemData, parentContent);
}
}, this);
},
// 这里,因为项目里的需求,我需要往里面添加额外的组件
// 将其他的部分注释掉,以符合这里数据结构
_createBranchCatalog: function(itemData, parentContent){
var i = 0 ;
i += i;
var container = domCon.create('div',{class:'branch-catalog ',style:'cursor:pointer ;margin-left:' +(i*7)+'%'},parentContent); if(itemData.id === 1){
// var dropContainer = domCon.create('img',{class:'dropContainer',id: 'firstDrop', src: itemData.drop, style:'width:10px;height: 10px; vertical-align: middle; margin-top:2%'},container);
// var space = domCon.create('img',{style: 'width:3px'},container);
// var wjjContainer = domCon.create('img',{class: "wjjContainer",id:"Folder", src: itemData.photo ,style: 'width:15px ;height:15px;vertical-align: middle; margin-top:2%'},container);
// var space = domCon.create('img',{style: 'width:3px'},container);
var nameContainer = domCon.create('span',{class: "nameContainer",id:"firstNameNode",innerHTML:itemData.name, style:'position:absolute;font-size: 12px;vertical-align: middle; margin-top:2%'},container);
}
if(itemData.id !== 1){
// var dropContainer = domCon.create('img',{class:'dropContainer',id: 'firstDrop', src: itemData.drop, style:'width:10px;height: 10px; vertical-align: middle; margin-top:4%'},container);
// var space = domCon.create('img',{style: 'width:3px'},container);
// var wjjContainer = domCon.create('img',{class: "wjjContainer",id:"Folder", src: itemData.photo ,style: 'width:12px ;height:12px; vertical-align: middle;margin-top:4%'},container);
// var space = domCon.create('img',{style: 'width:3px'},container);
var nameContainer = domCon.create('span',{class: "nameContainer",id:"firstNameNode",innerHTML:itemData.name, style:'position:absolute;font-size: 12px;vertical-align: middle; margin-top:2%'},container);
// var shancContainer = domCon.create('img',{class: "shancContainer",id:"firstDelete", src: itemData.delete,style: 'width:20px ;height:20px ;float: right'},container);
// var inputContainer = domCon.create('input',{type: 'file', style: "display: none;float: right;"}, container);
// this.isInputContainer = inputContainer;
// var shucContainer = domCon.create('img',{class: "shucContainer",id:"firstOutput", onclick:'document.execCommand(\'SaveAs\');', src: itemData.output,style: 'width:12px ;height:12px ;float: right'},container);
// on(shucContainer, 'click', lang.hitch(this, this._outputData));
}
/ **if(itemData.childAccordion.length > 0){
var content = domCon.create('div', {class: 'content',style:'cursor:pointer ;margin-left:' +((i+1)*7)+'%'}, container);
var childAccordion = domCon.create('div', {class: 'accordion transition '}, content);
this._createAccordionCatalog(itemData.childAccordion, childAccordion);
} else {
dropContainer.style.visibility = "hidden";
} on(dropContainer,'click', lang.hitch(this, function (e) {
this._changeDirection(e, dropContainer);
})); **/
}, _createLeafCatalog: function(itemData, parentContent){
var leafItem = domCon.create('div', {class: 'item bounce-to-right', style: 'cursor:pointer;margin-left:7%'}, parentContent);
// var leafCont = domCon.create('img', {class: 'wjContainer',src: itemData.photo ,style: 'width:12px ;height:12px; vertical-align: middle; margin-top:3%'}, leafItem);
// var space = domCon.create('img',{style: 'width:3px'},leafItem);
var topicName = domCon.create('span', {class: 'topic-name', innerHTML: itemData.name, style:'position:absolute;font-size: 10px;vertical-align: middle; margin-top:2%'}, leafItem); }, // 改变下拉框的方向
/** _changeDirection: function (e, dropContainer) {
console.log(e); console.log(dropContainer);
var dataLength = e.path[1].childNodes.length;
var hideDiv = e.path[1].childNodes[dataLength - 1];
if(hideDiv.style.display === ""){
hideDiv.style.display = "none";
dropContainer.style.transform = 'rotate(-90deg)';
} else if(hideDiv.style.display === "none"){
hideDiv.style.display = "block";
dropContainer.style.transform = 'rotate(0deg)';
} else if(hideDiv.style.display === "block"){
hideDiv.style.display = "none";
dropContainer.style.transform = 'rotate(-90deg)';
}
}, **/ 总结:循环生成目录树其实不难,是个很常见的问题,主要就是理解其数据结构,需要一直循环一个数据直至其全部被解析结束。

dojo里添加目录树的更多相关文章

  1. 【手撸一个ORM】第四步、Expression(表达式目录树)扩展

    到这里,Orm的基架已经搭起来了,接下来就是激动人心的部分,表达式目录树转Sql语句,SqlDataReader转数据实体等等,但是在这之前,我们需要扩展下表达式目录树的方法,以方便后面的相关操作. ...

  2. Asp.net MVC 如何向webform一样在IIS里添加虚拟目录

    相信很多用webform的程序猿都习惯性的使用虚拟目录的形式来对一个程序添加新的功能,那么在mvc下该如何来弄呢? 首先得有一个项目基层的项目,然后我们在这个项目的基础上新增一个功能模块,例如信息发布 ...

  3. 【专家坐堂Q&A】在 petalinux-config 中选择外部来源时,可将符号链路添加内核来源目录树

    问题描述 作为 petalinux-config 菜单的一部分,现在可以将 Linux 内核指定为外部来源. 如果选择了该选项,可为内核来源目录树添加两个符号链路. 这会带来两个问题: 1. 符号链路 ...

  4. 原创的基于HTML/CSS/JavaScript的层级目录树

    之前参加过一些基于HTML/CSS/JavaScript的项目,当在页面中需要生成一颗目录树时,总是首先想着网上有没有现成的生成树的源代码,比如dtree.zthee,或者使用一些javascript ...

  5. linux学习心得之目录树开端与/etc(图文)

    linux学习心得之目录树开端与/etc(图文) linux中“一切皆文件”,学习linux一年了,在学习过程中对目录树的一点心得,分享给大家,有不对的地方敬请斧正. 不多说了,先上图: 根目录: / ...

  6. MVC图片上传详解 IIS (安装SSL证书后) 实现 HTTP 自动跳转到 HTTPS C#中Enum用法小结 表达式目录树 “村长”教你测试用例 引用provinces.js的三级联动

    MVC图片上传详解   MVC图片上传--控制器方法 新建一个控制器命名为File,定义一个Img方法 [HttpPost]public ActionResult Img(HttpPostedFile ...

  7. Android原生PDF功能实现:PDF阅读、PDF页面跳转、PDF手势伸缩、PDF目录树、PDF预览缩略图

    1.背景 近期,公司希望实现安卓原生端的PDF功能,要求:高效.实用. 经过两天的调研.编码,实现了一个简单Demo,如上图所示. 关于安卓原生端的PDF功能实现,技术点还是很多的,为了咱们安卓开发的 ...

  8. 05.表达式目录树Expression

    参考文章 https://www.cnblogs.com/xyh9039/p/12748983.html 1. 基本了解 1.1 Lambda表达式 演变过程 using System; namesp ...

  9. visual studio 2019工具里添加开发中命令提示符的方法

    最新新装了visual studio 2019,发现默认的没有开发者命令提示符 现将添加步骤描述如下: 从VS2019菜单选择"Tools",然后选择"外部工具" ...

随机推荐

  1. mysql Incorrect usage of UNION and ORDER BY 错误备忘

    出现这个错误的语句是酱紫的 select xxx from aaa order by xxx union all select yyy from bbb order by yyy 错误原因居然是,如果 ...

  2. js实现复制内容到粘贴板

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  3. js入门关于js‘i++’‘++i’和‘i--’‘--i’计算的问题

    一,i++和++i; i++是先赋值在运算,++i是先运算在赋值: 例如:var a=1 a++:在运算时是按照1计算的:但在下面再次出现时是按照2进行运算: ++a:在运算时是按照2计算的:在下面再 ...

  4. Log4j源码分析

    一.slf4j和log4j的关系: 也就是说slf4j仅仅是一个为Java程序提供日志输出的统一接口,并不是一个具体的日志实现方案,就比如JDBC一样,只是一种规则而已.必须搭配具体的log实现方案比 ...

  5. LVS中Windows作为真实主机(RealServer)时的设置方法

    最近,公司新推了一个电商项目,IIS+ASP.而上面大大规划了要用 LVS 负载均衡集群,在这个技术陈旧的企业,LVS 项目还是去年才真正推行.由于最开始是由我测试的,所以这次的部署又落到了我头上了. ...

  6. 【C++】static关键字的总结

    转自 https://www.cnblogs.com/BeyondAnyTime/p/2542315.html C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的s ...

  7. js一些常规操作

    1.判断数组为空 var arrayList = [] 方法1. if (arrayList == (null || "" || undifine)) { 为空操作 } 方法2. ...

  8. bzoj5108: [CodePlus2017]可做题

    Description qmqmqm希望给sublinekelzrip出一道可做题.于是他想到了这么一道题目:给一个长度为n的非负整数序列ai,你需 要计算其异或前缀和bi,满足条件b1=a1,bi= ...

  9. 前端——JavaScript之if语句

    4.1 if语句 如果……否则……  , 让程序出现分支 1        <script type="text/javascript"> 2           va ...

  10. java.util.concurrent包下集合类的特点与适用场景

    java.util.concurrent包,此包下的集合都不允许添加null元素 序号 接口 类 特性 适用场景 1 Queue.Collection ArrayBlockingQueue 有界.阻塞 ...