Dojo高级Web2.0 UI组件库---Tree组件

Tree组件可以把有层次关系的数据用树状结构展现出来,就如同 Windows 系统的资源浏览器。Tree有两个模板,一个是Tree模板,一个是TreeNode模板,应该说Tree模板就是一个容器,里面有很多TreeNode.而初始化树,打开树节需要的数据,是通过来提供的。提供了封装的标准的数据存取API,作为统一的数据访问层而存在。所有的数据都是item或者item的属性。提供了一个基本的ItemFileReadStore类来读取JSON格式数据,而dojox提供了更多扩展,比如XmlStore, CsvStore, OpmlStore等,也可以自定义自己的store类型。

术语

data source数据源
datastore
item行记录
attribute
reference 有些类似外键依赖,但外键指向的父记录,而reference指向子记录的列表
identity主键
query 查询条件,是一个Object类型,形如{ name: '?hite*', aisle: 'Condiments' },”,”表示条件的and关系,通配符”?”,”*”表示一个或多个字符(包含0个)
JSON(JavaScript Object Notation)

是一种轻量级的数据交换格式。它是基于Javascript标准的一个子集,JavaScriptd的数据结构(如字符串、数组、对象)的表示方式恰好与JSON相同,所以JSON可以被Javascript无损的识别。它是一种简单文本格式,与XML相比,它更加易读、更少的数据冗余。下面就是一段典型的JSON格式数据,例如:

{ identifier: 'name',
items: [
{ name: 'Adobo', aisle: 'Mexican' },
{ name: 'Balsamic vinegar', aisle: 'Condiments' },
{ name: 'Worcestershire Sauce', aisle: 'Condiments' }]
}

 

  
  
  
  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

{ identifier: 'name',
items: [
{ name: 'Adobo', aisle: 'Mexican' },
{ name: 'Balsamic vinegar', aisle: 'Condiments' },
{ name: 'Worcestershire Sauce', aisle: 'Condiments' }]
}

假设该段数据存放于文件,相应的Dojo datastore的声明和使用如下:

<!- 指明了datastore的类型是;数据的url,请注意这里除了可以是文件路径,也可以是一段请求得到的流;以及该datastore的jsId-->
<div dojoType="" jsId="pantryStore"
url=""></div>
<div  name="pantry_item" dojoType=""
store="pantryStore"
searchAttr="name" value="Vinegar" autoComplete="true" 
></div>
<!--声明dojoType为的一个组件,该组件在html页面上展现形式为一个下拉框,需要有数据填充,其中store属性指向了jsId为pantryStore的一个datastore,由此把刚刚在前面定义的datastore的数据关联了起来。-->
也可以通过编程的方式读取datastore数据,例如:
/*用编程实现方式定义了一个datastore,在这里是,其实还可以是其它的datastore类型,如XmlStore,CsvStore等,甚至可以是自定义的datastore类型*/
var pantryStore = new ({url: "pantry_" } );
//自定义函数,为fetch函数做准备,用于数据处理。
var gotList = function(items, request){ 
var itemsList = "";
for (var i = 0; i < ; i++){
// getValue函数,它是由封装的API,用于得到某个item的某个属性名称的值。
itemsList += pantryStore .getValue(items[i], "name") + " "; }
alert("All items are: " + itemsList);
}
//自定义函数,为fetch函数做准备,用于异常处理。
var gotError = function(error, request){ 
alert("The request to the store failed. " + error);
}
({onComplete: gotList, onError: gotError,query:{name:”*”}});/*执行数据查询的语句,需要传入一些查询选项,比如在示例中出现的onComplete:在得到所有符合条件的数据后的处理函数,参数为item的列表;onError:出现异常的处理函数;query: 查询条件,是一个Object类型,形如{ name: '?hite*', aisle: 'Condiments' },”,”表示条件的and关系,通配符”?”,”*”表示一个或多个字符(包含0个)*/

应用Tree组件创建一个树的实例需要按下步骤进行:

1.创建一个用于存储树结构数据的数据源ItemFileReadStore,创建方法如下:

function createTreeStore() {var treeStore = new ( {url :''});return treeStore;
}

2.使用ForestStoreModel对store进行了包装,在tree组件多引入了一个Model层,它能够进行一些特殊处理,如:没有根结点时,会自动增加一个父结点等。创建方法如下:

var treeStore = createTreeStore();var treeModel = new ( {query : {type :'Province'//从数据源中查询type :'Province'的数据
  },store :treeStore,root :true,//定义根结点rootId :"中国",rootLabel :"中国城市列表",childrenAttrs : [ 'children' ]
});

3.然后使用ForestStoreModel创建一个TreeModel,该TreeModel可以解析结点的子结点,它是一个递归的程序结构。创建方法如下:

function createTreeModel(item, treeStore, typeValue) {var newModel = new ( {query : {type :typeValue},store :treeStore,root :true,rooId :item,rootLabel :item || getLabel(item),childrenAttrs : [ 'children' ]});return newModel;
}

4.在页面文件中定义一个Tree,定义方法如下:

<div   dojoType= ""   id= "tree"   jsId= "tree "   model= "treeModel"   openOnClick= "true">

其中openOnClick= "true"表示单击结点时展开该结点的子结点。
通过上面的分析,下面创建一个动态生成树的例子,在该例中,数据源是从服务器动态获得并在前台显示。首先创建一个用于生成树型结构的数据文件,本例中用的是JSON格式的数据源,该数据内容定义的是中国的部分省市名称,文件内容定义如下:

{ identifier: 'name',label: 'name',items: [{ name:'陕西省', type:'Province',children:[{_reference:'西安'}, {_reference:'延安'}] },{ name:'西安', type:'city' },{ name:'延安', type:'city',children:[{_reference:'子长县'}, {_reference:'吴起县'}] },{ name:'子长县', type:'county' },{ name:'吴起县', type:'county' },{ name:'北京市', type:'Province', populiation:'921万',children:{_reference:'海定区'}},{ name:'海定区', type:'city',www:' ', populiation:'92万'},{ name:'江苏省', type:'Province',children:[{_reference:'苏州市'}, {_reference:'南京市'}] },{ name:'苏州市', type:'city',  populiation:'108 万', 面积:'1,972 sq km',children:[{_reference:'昆山'}, {_reference:'张家港'}] },{ name:'昆山', type:'county' },{ name:'张家港', type:'county' },{ name:'南京市', type:'city' }
]}

然后上面内容存为文件名为,并存放在与调用该文件的HTML页面的同一目录中,为了能够显示中文内容,应把该文件保存为UTF-8格式。
下面就是一个使用Tree的例子,实现代码如下:

<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>TREE</title><style type="text/css">
@import "dojoapp/dojo/resources/";
@import "dojoapp/dijit/themes/tundra/";
</style><script type="text/javascript"djConfig="parseOnLoad: true, isDebug: true"src="dojoapp/dojo/"></script><script>("");("");
("");( function() {("tree", null, function(message) {("选择的结点:" + );("选择的结点:" + );("cc"). attr('href',);//打开树结点的网页连接("cc").refresh();//在此可以调用XHR修改后台JSON数据,这样可以增加或修改树的结点
  });});function createTreeStore() {var treeStore = new ( {url :''});return treeStore;}var treeStore = createTreeStore();var treeModel = new ( {query : {type :'Province'},store :treeStore,root :true,rootId :"中国",rootLabel :"中国城市列表",childrenAttrs : [ 'children' ]});function createTreeModel(item, treeStore, typeValue) {var newModel = new ( {query : {type :typeValue},store :treeStore,root :true,rooId :item,rootLabel :item || getLabel(item),childrenAttrs : [ 'children' ]});return newModel;}
</script></head><body class="tundra"><div dojoType="" id="tree" jsId="tree " model="treeModel"openOnClick="true"></div><div dojoType="" region="bottom" id="cc"style="background-color: #ACBFD0; height: 200px;" splitter="true"></div></body>
</html>

 

转载于:https://www.cnblogs.com/lancee/archive/2013/02/06/2900231.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360984.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Java 8防止日志过宽

一些日志将被机器消耗并永久保存。 其他日志仅用于调试和供人类使用。 在后一种情况下&#xff0c;您通常要确保您不会产生过多的日志&#xff0c;尤其是不会产生太宽的日志&#xff0c;因为一旦行长超过一定大小&#xff08; 例如&#xff0c;此Eclipse bug &#xff09;&…

[one day one question] webpack打包压缩 ES6 js、.vue报错

问题描述&#xff1a; 报错&#xff1a; ERROR in js/test.js from UglifyJs Unexpected token punc ?(?, expected punc ?:? [js/test.js:1374,5]&#xff0c;这怎么破&#xff1f; 解决方案&#xff1a; 配置babel&#xff0c;把配置放到文件【.babelrc】中{"prese…

UVA10236 斐波那契素数

题意&#xff1a;任取斐波那契数列中一项f[i],若对于所有j 解法&#xff1a;这题的理论分析在黑书上有&#xff0c;结论是从第五项开始下标为素数的斐波那契数都是斐波那契素数 #include <stdio.h> #include <string.h> const int MAXN 250010;; int prime[25010]…

[one day one question] safari缓存太厉害

问题描述&#xff1a; safari缓存太厉害&#xff0c;这怎么破&#xff1f; 解决方案&#xff1a; window.onpageshow function(event) {if (event.persisted) {window.location.reload() }}; 君生我未生&#xff0c;我生君已老 君恨我生迟&#xff0c;我恨君生早 君生我未生&…

Android 网络编程之Http通信

Android中提供的HttpURLConnection和HttpClient接口可以用来开发HTTP程序。以下是本人在学习中的总结与归纳。1. HttpURLConnection接口 首先需要明确的是&#xff0c;Http通信中的POST和GET请求方式的不同。GET可以获得静态页面&#xff0c;也可以把参数放在URL字符串后面&…

EE Servlet 3:在Servlet中生成HTML输出

如果您只需要在EE Web模块中处理少量请求URI&#xff0c;则在Servlet代码中生成自己HTML响应可能比使用完整的模板库更容易。 作为示例的一部分&#xff0c;我尝试了一个非常简单的Java DSL&#xff0c;该Java DSL在编写自己的Serlvet时生成html输出。 代码如下&#xff1a; p…

[one day one question] express 不缓存如何实现

问题描述&#xff1a; express 默认缓存&#xff0c;这怎么破&#xff1f; 解决方案&#xff1a; apiRoutes.use(function (req, res, next) {res.setHeader(Cache-Control, no-cache, no-store, must-revalidate);res.setHeader(Pragma, no-cache);res.setHeader(Expires, 0)…

正则表达式摘录

正则表达式到底是什么东西&#xff1f;在编写处理字符串的程序或网页时&#xff0c;经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说&#xff0c;正则表达式就是记录文本规则的代码。常用元字符 代码说明.匹配除换行符以外的任意…

Java生态系统– 2014年我的5大亮点

1. 2月1日-RedMonk Analyst公司宣布Java比以往任何时候都更加流行和多样化&#xff01; 2014年&#xff0c;随着FOSDEM的Free Java会议室的年会&#xff0c;Java生态系统开始轰轰烈烈地响起。 除了关于OpenJDK和相关主题的许多精深的技术讲座外&#xff0c;Steve OGrady&#x…

WEB前端大神之路之基础篇

CSS篇&#xff1a; 1.CSS权重&#xff1a; 不重复造轮子啦&#xff0c;直接传送门&#xff08;CSS选择器的权重与优先规则&#xff09; JavaScript篇&#xff1a; 1.this关键字&#xff1a; 它是一种引用&#xff08;referent&#xff09;。指向的是当前上下文&#xff08;con…

与Java EE和Camel的轻量级集成

Enterprise Java具有不同的风格和观点。 从简单的平台技术开始&#xff0c;即众所周知的Java EE&#xff0c;再到不同的框架和集成方面&#xff0c;最后是涉及以数据为中心的用户界面或特定可视化效果的用例。 Java EE本身无法解决的最突出的问题是“集成”。 有许多来自知名供…

java=====Striing date 转化

java中string与date(日期)格式之间的转换 经常遇到string和date之间的转换&#xff0c;把相关的内容总结在这里吧&#xff1a; 1.string格式转化为Date对象&#xff1a; //把string转化为dateDateFormat fmt new SimpleDateFormat("yyyy-MM-dd"); Date date fmt.par…

oracel Pipelined pipe row的用法

oracle的管道也可以返回集合类型&#xff0c;跟游标类似 CREATE TYPE my_type AS OBJECT ( field1 NUMBER, field2 VARCHAR2 (50) ); CREATE TYPE my_typelist AS TABLE OF my_type; CREATE OR REPLACE FUNCTION pipelineme RETURN my_typelist PIPELINED IS -…

在Spring中使用Netflix Hystrix批注

除了在主页上引述之外&#xff0c;我想不出更好的方式来描述Netflix Hystrix库的特定功能&#xff1a; 延迟和容错方式&#xff1a; 停止级联故障。 后备和正常降级。 无法快速快速恢复。 使用断路器隔离线程和信号量。 我看到了Josh Long&#xff08; starbuxman &#xff0…

[工具库]JFileDownloader工具类——多线程下载网络文件,并保存在本地

本人大四即将毕业的准程序员&#xff08;JavaSE、JavaEE、android等&#xff09;一枚&#xff0c;小项目也做过一点&#xff0c;于是乎一时兴起就写了一些工具。 我会在本博客中陆续发布一些平时可能会用到的工具。 代码质量可能不是很好&#xff0c;大家多担待&#xff01; 代…

使用JAX-RS和Spring构建HATEOAS API

在我以前的博客文章中&#xff0c;我展示了如何使用Spring Boot配置Jersey多么容易。 我对Spring Boot和Jersey的探索并没有结束&#xff0c;我研究了在Spring Boot应用程序中将Spring HATEOAS和Jersey一起使用的可能性。 Spring HATEOS允许创建遵循HATEOAS原理的REST表示形式&…

企业中的微服务:敌是友?

宏观问题的微观解决方法&#xff1f; 微服务的炒作无处不在&#xff0c;尽管业界似乎无法就确切的定义达成共识&#xff0c;但我们一再被告知&#xff0c;从单一应用程序转向由小型服务组成的面向服务的架构&#xff08;SOA&#xff09;是正确的方法。构建和发展软件系统。 但是…

自定义百度地图气泡

自定义百度地图气泡 http://www.cnblogs.com/jz1108/archive/2011/09/15/2152122.html 转载于:https://www.cnblogs.com/ygm900/archive/2013/02/26/2933000.html

使用Bean验证扩展PrimeFaces CSV

你们中有些人已经知道我和我的合著者Mertalışkan正在研究PrimeFaces Cookbook的2.版。 Packt Publishing允许我从新章节“客户端验证”的一个食谱中摘录一小部分摘录。 这将有助于使读者知道这本书的内容。 在此博客文章中&#xff0c;我想讨论使用Bean验证扩展的PrimeFaces客…

ASP.NET.CORE发布后启动网站出现500.19-0x8007000d错误解决方法

本项目使用的是netcoreapp2.2&#xff0c;缺少的XML文件是swagger。发布采用的是文件系统、依赖框架。 我第一次发布asp.net.core的后台&#xff0c;发布后启动网站出现500.19错误-0x8007000d。百度查了一下原因&#xff0c;2其中大多数人说是因为没有权限&#xff0c;需要编辑…