树控件

ExtJS 中提供了现存的树控件,通过这些控件可以在B/S 应用中快速开发出包含树结构信息的应用。

A:TreePanel

基本使用

树控件由Ext.tree.TreePanel 类定义,控件的名称为treepanel,TreePanel 类继承自Panel面板。在ExtJS 中使用树控件其实非常简单,我们先来看下面的代码。

代码的第一句使用new Ext.tree.TreeNode 类来创建一个树节点,第二句使用树节点的root 的appendChild 方法来往该节点中加入一个子节点,最后直接使用new Ext.tree.TreePanel来创建一个树面板,要树面板的初始化参数中指定树的root 属性值为前面创建的root 节点,也就是树根节点。

ExtJS 的树控件提供了对这种功能的支持,你只需要在创建树控件的时候,通过给树指定一个节点加载器,可以用来从服务器端动态加载树的节点信息。我们来看下面的代码:

Ext.onReady(function(){

var root=new Ext.tree.TreeNode({

id:"root",

text:"树的根"});

root.appendChild(new Ext.tree.TreeNode({

id:"c1",

text:"子节点"

}));

var tree=new Ext.tree.TreePanel({

renderTo:"hello",

root:root,

width:100

});

});

代码的第一句使用new Ext.tree.TreeNode 类来创建一个树节点,第二句使用树节点的root 的appendChild 方法来往该节点中加入一个子节点,最后直接使用new Ext.tree.TreePanel来创建一个树面板,要树面板的初始化参数中指定树的root 属性值为前面创建的root 节点,也就是树根节点。

ExtJS 的树控件提供了对这种功能的支持,你只需要在创建树控件的时候,通过给树指定一个节点加载器,可以用来从服务器端动态加载树的节点信息。我们来看下面的代码:

var root=new Ext.tree.AsyncTreeNode({

id:"root",

text:"树的根"});

var tree=new Ext.tree.TreePanel({

renderTo:"hello",

root:root,

loader: new Ext.tree.TreeLoader({url:"treedata.js"}),

width:100

});

treedata.js 这个url 返回的内容如下:

[{

id: 1,

text: '子节点1',

leaf: true

},{

id: 2,

text: '儿子节点2',

children: [{

id: 3,

text: '孙子节点',

leaf: true

}]

}]

执行上面的程序,可以得到一棵异步加载子节点的树,点击”根节点”会到服务器端加载子节点

当然上面的程序是一次性加载完了树的所有节点信息,我们也可以实现让每一个节点都支持动态加载的树,只需要在通过服务器请求数据的时候,每次服务器端返回的数据只只包含子节点,而不用把孙子节点也返回即可。比如把上面treedata.js 中的内容改为下面的内容:

[{

id: 1,

text: '子节点',

leaf: false

}]

也就是节点树中只包含一个子节点,而该子节点通过指定leaf 值为false (默认情况该值为false),表示该节点不是一个叶子节点,其下面还有指节点。

当然这是一个无限循环的树,在实际应用中我们服务器端返回的数据是程序动态产生的,因此不可能每一次都产生leaf 为false 的节点,如果是叶子节点的时候,则需要把返回的JOSN 对象中的leaf 设置为true。如下所示:

[{

id: 1,

text: '子节点',

leaf:true

}]

事件处理

当然,仅仅能显示一棵树还不够,我们一般还需要在用户点击树节点的时候执行相应的东西,比如打开某一个连接,执行某一个函数等,这就需要使用到事件处理。比如下面的代码:

Ext.onReady(function(){

var root=new Ext.tree.TreeNode({

id:"root",

text:"树的根"});

var c1=new Ext.tree.TreeNode({

id:"c1",

text:"子节点"

});

root.appendChild(c1);

var tree=new Ext.tree.TreePanel({

renderTo:"hello",

root:root,

width:100

});

tree.on("click",function(node,event){

alert("您点击了"+node.text);

}

);

c1.on("click",function(node,event){

alert("您点击了"+node.text);

}

);

});

执行上面的程序,当用户点击树控件中的任意节点时,都会弹出一个提示信息框,当用户点击c1 这个子节点时,会弹出两次提示信息框。因为我们除了指定tree 的click 事件响应函数以外,另外又给node 节点指定单独的事件响应函数。

当然,如果只是要实现当点击树节点时跳到某一个指定url 的功能则非常简单。看下面的代码:

Ext.onReady(function(){

var root=new Ext.tree.TreeNode({

id:"root",

href:"http://www.baidu.com",

hrefTarget:"_blank",

text:"树的根"});

var c1=new Ext.tree.TreeNode({

id:"c1",

href:"http://www.baidu.com",

hrefTarget:"_blank",

text:"子节点"

});

root.appendChild(c1);

var tree=new Ext.tree.TreePanel({

renderTo:"hello",

root:root,

width:100

});

});

执行程序,点击树节点,将会在浏览新窗口中打开节点中href 指定的链接在ExtJS 中,不管是叶子节点还是非叶子节点,都统一用TreeNode 表表示树的节点。在ExtJS 中,有两种类型的树节点。一种节点是普通的简单树节点,由Ext.tree.TreeNode 定义,另外一种是需要异步加载子节点信息的树节点,该类由Ext.tree.AsyncTreeNode 定义。看下面的代码:

Ext.onReady(function(){

var tree=new Ext.tree.TreePanel({

renderTo:"hello",

root:new Ext.tree.AsyncTreeNode({

text:"根节点"

}),

width:100

});

});

执行程序,点击树中的”根节点”则会一直发现树会尝试加载这个节点的子节点,由这里没有指定树的加载器,所以”根节点”会变成一直处于加载的状态。

B: TreeNode AsyncTreeNode 可以同时使用

对于普通的TreeNode 来说,可以通过调用节点的appendChild、removeChild 等方法来往该节点中加入子节点或删除子节点等操作。

TreeNode 与AsyncTreeNode 可以同时使用,比如下面的代码:

Ext.onReady(function(){

var root=new Ext.tree.TreeNode({

id:"root",

text:"树的根"

});

var c1=new Ext.tree.TreeNode({

text:"子节点1"

})

var c2=new Ext.tree.AsyncTreeNode({

text:"子节点2"

});

root.appendChild(c1);

root.appendChild(c2);

var tree=new Ext.tree.TreePanel({

renderTo:"hello",

root:root,

width:300,

loader:new Ext.tree.TreeLoader({

applyLoader:false,

url:"treedata.js"

})

});

});

treedata.js 中的内容仍然是:

[{

id: 1,

text: '子节点'

}]

另外要在树以外的程序中得到当前选择的节点,可以通过TreePanel 的getSelectionModel 方法来获得,该方法默认返回的是Ext.tree.DefaultSelectionModel 对象,DefaultSelectionModel 的getSelectedNode 方法返回当前选择的树节点。比如要得到树tree 中当前选择节点,代码如下:

tree.getSelectionModel().getSelectedNode()

对于ExtJS 中的树来说,树加载器TreeLoader 是一个比较关键的部件,树加载器由

Ext.tree.TreeLoader 类定义,只有AsyncTreeNode 才会使用TreeLoader。看下面的代码:

Ext.onReady(function(){

var loader=new Ext.tree.TreeLoader({

url:"treedata.js"

});

var root=new Ext.tree.AsyncTreeNode({

id:"root",

text:"根节点",

loader:loader});

var tree=new Ext.tree.TreePanel({

renderTo:"hello",

root:root,

width:100

});

});

首先我们使用Ext.tree.TreeLoader 来初始化了一个TreeLoader 对象,构造函数中的配置参数url 表示获得树节点信息的url 。然后在初始化根节点的时候我们使用的是AsyncTreeNode,在该节点中指定该节点的laoder 为前面定义的loader。执行这段程序,在点击”根节点”时,会从服务器端指定root 节点的子节点信息。

TreeLoader 严格来说是针对树的节点来定义的,可以给树中的每一个节点定义不同的TreeLoader,默认情况下,如果一个AsyncTreeNode 节点在准备加载子节点的时候,如果该节点上没有定义loader,则会使用TreePanel 中定义的loader 作为加载器。因此,我们可以直接在TreePanel 上面指定loader 属性,这样就不需要给每一个节点指定具体的TreeLoader了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • 姓名: 李小娜 [嵌牛导读] :这篇文章主要介绍了Java二叉排序树,包括二叉排序树的定义、二叉排序树的性质、二叉...
    n184阅读 616评论 0 0
  • 如需转载, 请咨询作者, 并且注明出处.有任何问题, 可以关注我的微博: coderwhy, 或者添加我的微信: ...
    coderwhy阅读 8,794评论 12 35
  • 树的代码 101. Symmetric Tree Given a binary tree, check wheth...
    lindsay_bubble阅读 468评论 0 0
  • 红黑树是平衡二叉查找树的一种。为了深入理解红黑树,我们需要从二叉查找树开始讲起。 BST 二叉查找树(Binary...
    kanehe阅读 1,370评论 0 8
  • “生而为人,对不起”,能说出这话的人,一定是体验了人生百味经历了风吹雨打才自卑厌世到这无可复加的地步。
    板栗叔阅读 194评论 0 0