`

ExtJS Tree点击选择节点,不展开/展开(三)

阅读更多

ExtJS Tree点击选择节点,不展开/展开(三)

 

实例讲解:点击触发域(Ext.form.TriggerField)三角按钮,弹出树面板窗口,并将触发域中的内容在树面板中选中,并展开选中节点的父目录

 

对应:ExtJS Tree刷新后只选择节点,不展开(二)

 

一.选中节点,不展开:
1.创建Tree:

//1.定义根节点:主管部门
var departRoot = new Ext.tree.AsyncTreeNode({
	text:"主管部门",
	draggable:false,
	expanded:true,	//节点展开
	id:'depart-root'
});
//2.定义子节点数据加载器
var dloader = new Ext.tree.TreeLoader({
	dataUrl:'getTree.base?doType=getDTreeByGrade&dtype=0',
	baseParams :{pid:''},
	baseAttrs: { uiProvider: Ext.tree.TreeCheckNodeUI } //添加 uiProvider 属性    
});
//3.获取主管部门子节点数据
dloader.on("beforeload",function(treeLoader, node){
	treeLoader.baseParams.pid = node.id;
},this);

//4.定义树面板,显示节点数据
var departTree = new Ext.tree.TreePanel({
	id:'departTree',
	root: departRoot, 
	checkModel: 'multiple',   
	animate:false,
	onlyLeafCheckable: true,
	enableDD:false,    
	border:false,    
	rootVisible:true,  
	autoScroll :true,
	lines: false,
  	loader:dloader,
	tbar:[
	      {
	    	  xtype:'label',
	    	  text:"文件号:"
	      },{
	    	  xtype:"textfield",
	    	  id:"serchFor5",
	    	  allowBland:true,
	    	  width:120
	      },{
	    	  text:"查找",
	    	  iconCls:"filter",
	    	  handler : search
	      }
  	]
});

 

2.创建触发域:

var departTg = new Ext.form.TriggerField({
	fieldLabel:'主管部门',
	width:250,
	readOnly: true,
	id:'departTg',
	name:'departTg',
	emptyText:"请选择主管部门"
 });

 

3.创建窗口:

var departWin = new Ext.Window({
	title:'主管部门',
	width:300,
	height:260,
	autoScoll:true,
	layout:'fit',
	closeAction:'hide',
	collapsible:true,
	items:[departTree], 
	buttons:[{
			text:"确定",
			handler:function(){
				var node = departTree.getChecked();
				if(node.length == 0){
					Ext.Msg.alert("系统提示","请选择主管部门");
					return;
				}
				var name = new Array();
				var value = new Array();
				dids  = new Array();
				for (var i = 0; i < node.length; i++) {
					dids.push(node[i].id);
					name.push(node[i].text);
					value.push(node[i].id);
				}
				departTg.setValue(name.join());//给触发域赋值
				Ext.getCmp("departid").setValue(value.join());
				departWin.hide();
			}
		},{
			text:"取消",
			handler:function(){
				departWin.hide();
			}
		}
    ]
});

 

4.增加单击事件和选择事件:

//选中目录同时展开目录
departTree.on("checkchange",function(node,checked){
	if(checked){
		node.expand();
	}
});
//单击时,若是目录则展开或收缩,若是子节点则选中或不选中
departTree.on("click",function(node){
	if(!node.isLeaf()){
		node.toggle();
	}
	else{
    	node.ui.toggleCheck();
    }
});

 

5.单击触发域打开树窗口并显示勾选项:

departTg.onTriggerClick = departTrigFun;
function departTrigFun(e){
	departWin.show();
	var childNodes = departRoot.childNodes;
	if(childNodes.length > 0) {
		showCheckDeparts(childNodes);
	}
	else {
		loadDepart();
	}
}
//加载树并勾选对应项
function loadDepart(){
	dloader.on("load",function(treeLoader,node){
		showCheckDeparts(node);
	});
}
//勾选对应项
function showCheckDeparts(childNodes){
	//先清楚全部勾选项
	for (var i = 0; i < childNodes.length; i++) {
		childNodes[i].ui.toggleCheck(false);
	}
	//将触发域中的内容分割为一个数组
	departs = departTg.getValue();
	childNodes = departRoot.childNodes;
	var departArr = null;
	if(departs != null) {
		departArr = departs.split(",");
	}
	//循环对比,相对应的进行勾选
	if(departArr != null && departArr.length > 0) {
		for (var j = 0; j < childNodes.length; j++) {
			var text = childNodes[j].text;
			for (var i = 0; i < departArr.length; i++) {
				if(departArr[i] != text){
					continue;
				}
				childNodes[j].ui.toggleCheck(true);
			}
		}
	}
}

 

6.图示:

 

 
 

二.选中节点,并展开:
1.创建Tree:

//1 定义根节点  
var auditRoot = new Ext.tree.AsyncTreeNode({  
    id:'tree-root',  
    text:"部门",  
    expanded:true,    //根节点默认展开(注意和TreePanel中的rootVisible:true的联系)
    draggable:false   //根节点不可拖动  
});  
//2 定义节点数据加载器  
var auditLoader = new Ext.tree.TreeLoader({  
    dataUrl:'getKeshiUsersByGrade.up?doType=getKeshiUsersByGrade',  //此处不是url,和Store的Proxy不同  
    baseParams :{pid:''},  
    baseAttrs:{uiProvider:Ext.tree.TreeCheckNodeUI} //必须有该项,不然树节点无法出现选择框  
});
//3 定义数据加载前触发方法  
auditLoader.on("beforeload",function(treeLoader,node){  
	auditRoot.setText(dname);
    treeLoader.baseParams.pid = node.id;  
    treeLoader.baseParams.did = did;  
},this);  

//4 定义树形面板,用于显示数据  
var auditTree = new top.Ext.tree.TreePanel({    /**注意top!!!*/  
    root:auditRoot,      //根节点  
    loader:auditLoader,  //数据加载器  
    checkModel:"single", //复选框只能单选,多选为:multiple,级联:cascade  
    rootVisible:true,    //显示根节点  
    autoScroll:true,      
    animate:false,  
    enableDD:false,      //不允许子节点拖动  
    onlyLeafCheckable:true,  
    width:250
});  

 

2.创建触发域:

var selectedAuditRow;//定义全局变量,获取点击列表某一行时通过复选框获得的行号。  
     
var auditTrigger = new Ext.form.TriggerField({  
     emptyText:"请选择...",  
     allowBlank:false,  
     readOnly:true
 });

 

3.创建窗口:

var auditTreeWin = new top.Ext.Window({    /**注意top!!!*/  
    title:"用户选择",  
    layout:"fit",  
    closeAction:"hide",  
    modal:true,  
    width:250,  
    height:250,  
    items:auditTree,  
    buttons:[  
        {  
            text:"确定",  
            handler:function(e){  /*点击选择树节点并将值显示在触发域的方法!*/
                var node = auditTree.getChecked();    //获取被选中的树节点  
                if(!node || node.length < 1){  
                	top.Ext.Msg.alert("系统提示","请选择科室用户!");  
                    return;  
                }  
                var name = new Array();  
                var value = new Array();  
                for (var i = 0; i < node.length; i++) {  
                    name.push(node[i].text);  
                    value.push(node[i].id);  
                }  
                var data = selectedAuditRow.data;    //获取选择的行的Record的Data数据对象  
                /*data["auditUserId"]= name.join(); —— —— 此处用这种方式给触发域赋值出错!!!必须用下面的方式!!! */    
                auditTrigger.setValue(name.join());  
                auditTreeWin.hide();  
            }  
        },{  
            text:"取消",  
            handler:function(){  
                auditTreeWin.hide();  
            }  
        }  
    ]  
});  

 

4.增加单击事件和选择事件:

//选中目录同时展开目录
auditTree.on("checkchange",function(node,checked){
	if(checked){
		node.expand();
	}
});
//单击时,若是目录则展开或收缩,若是子节点则选中或不选中
auditTree.on("click",function(node){
	if(!node.isLeaf()){
		node.toggle();
	}
	else{
    	node.ui.toggleCheck();
    }
});

 

5.单击触发域打开树窗口并显示勾选项:

/* 单击触发域打开树窗口并显示勾选项 */
auditTrigger.onTriggerClick = clickTriggerFun;
function clickTriggerFun(e){
	auditTreeWin.show();
	var parentNodes = auditRoot.childNodes;
	if(parentNodes.length > 0) {
		showCheckedNode(parentNodes);
	}
	else {
		loadTree();//节点为0,则先加载树
	}
}

/* 加载科室用户并勾选对应项 */
function loadTree(){
	auditLoader.on("load",function(treeLoader,node){
		showCheckedNode(node.childNodes);
	});
}

/* 勾选对应的选中项,并展开选中项的父目录 */
function showCheckedNode(parentNodes){
	//先展开再收缩父节点,让子节点充分显示
	for (var i = 0; i < parentNodes.length; i++) {
		parentNodes[i].expand();
		parentNodes[i].collapse();
	}
	//先循环清楚全部勾选项
	for (var i = 0; i < parentNodes.length; i++) {
		var childNodes = parentNodes[i].childNodes;
		for (var j = 0; j < childNodes.length; j++) {
			childNodes[j].ui.toggleCheck(false);
		}
	}
	//将触发域中的内容字符串分割为一个数组
	var tgValue = auditTrigger.getValue();
	childNodes = auditRoot.childNodes;
	var checkedArr = null;
	if(tgValue != null) {
		checkedArr = tgValue.split(",");
	}
	//循环对比,相对应的进行勾选
	if(checkedArr != null && checkedArr.length > 0) {
		for (var i = 0; i < parentNodes.length; i++) {
			var childNodes = parentNodes[i].childNodes;
			for (var j = 0; j < childNodes.length; j++) {
				var text = childNodes[j].text;
				for (var k = 0; k < text.length; k++) {
					if(checkedArr[k] == text) {
						childNodes[j].ui.toggleCheck(true);//勾选
						childNodes[j].parentNode.expand();//展开父节点
					}
				}
			}
		}
	}
}

 

注意:选中节点同时展开其父目录

 

6.图示:



 
 

注意区别:
1.第一个只有一级目录,子节点都在一级目录下,传参用childNodes

 
2.第二个有二级目录,子节点都在第二级目录下,传参用parentNodes

 

 

 

 

  • 大小: 6.6 KB
  • 大小: 2.9 KB
  • 大小: 11.3 KB
  • 大小: 2.6 KB
  • 大小: 7.7 KB
  • 大小: 12.8 KB
  • 大小: 7 KB
  • 大小: 7.2 KB
分享到:
评论

相关推荐

    extjs tree 异步加载树型

    异步加载树型是 ExtJS Tree 的一个重要特性,允许只在需要时动态加载子节点,从而提高页面的加载速度和用户体验。 异步加载通常通过 AJAX 请求实现,只有当用户展开一个节点时,才会向服务器请求该节点的子节点数据...

    动态加载extjs tree

    动态加载是ExtJS Tree的一个重要特性,它允许根据需要加载节点数据,减少了初次加载时的数据量,提高了用户体验。 动态加载,也称为懒加载(Lazy Loading),是指在用户滚动或展开特定节点时才请求并加载该节点及其...

    extjs tree 节点 链接 新窗口

    在处理Tree节点时,特别是涉及到链接和新窗口打开的情况,有一些特定的技术要点需要注意。 首先,标题“extjs tree 节点 链接 新窗口”指的是在ExtJS的树形组件中,如何为节点设置链接并在点击时在新窗口中打开。...

    extjs的tree的使用

    ExtJS的Tree组件还提供了一系列事件,如`beforeitemexpand`、`itemexpand`、`itemcollapse`等,这些事件可以在节点展开或收起时触发,允许你在这些时刻执行自定义代码,增加更多功能或进行状态管理。 ### 样式与...

    Extjs的tree

    - **展开/折叠**:用户可以点击节点来展开或折叠其子节点,也可以通过API实现。 - **选择**:TreePanel支持单选或多选模式,用户可以选择节点,也可以通过代码选择或取消选择。 - **拖放**:通过配置`draggable`...

    ExtJs Tree

    通过ExtJs Tree,用户可以直观地展示数据之间的层级关系,并支持多种交互操作,如展开、折叠节点等。 ### 特性与功能 #### 树形面板(Treepanel) - **自动滚动**:通过`autoScroll`属性设置为`true`,确保当内容...

    ExtJS4.2 tree 级联选择

    在ExtJS库中,Tree组件允许我们展示和操作数据以树形结构显示,而级联选择功能则意味着当用户选择一个节点时,它的所有子节点也会被自动选中,反之亦然,如果取消选中父节点,其所有子节点也将被取消选中。...

    extjs tree示例

    ExtJS Tree 示例是一种基于ExtJS库实现的交互式树形组件,它允许用户在Web应用程序中展示层次结构数据。在本示例中,我们将探讨如何使用ExtJS来创建、访问和操作一个树形结构,特别是在数据库操作方面,如添加和删除...

    ExtJs4 Checkbox tree

    由于Checkbox Tree支持多级节点,因此在处理全选/全不选或者级联选中时,需要使用递归算法遍历所有子节点,同步它们的选中状态。 9. **样式和模板**: 复选框的样式可以通过CSS自定义,如改变选中、未选中和三态...

    extjs tree 学习资料

    ExtJS Tree 是一个功能强大的JavaScript组件,用于在Web应用程序中创建和展示层次结构的数据,它在ExtJS框架中扮演着重要角色。这个压缩包“extjs tree 学习资料”显然是为那些希望深入理解并掌握ExtJS Tree组件的...

    extjs tree

    ExtJS Tree是基于ExtJS框架实现的一种数据结构展示方式,它主要用于展示层级关系的数据,例如组织结构、文件系统等。ExtJS是一个强大的JavaScript库,专为构建富客户端Web应用程序而设计,提供了丰富的组件化功能和...

    Extjs tree实例【源代码】

    ExtJs 2.2.1 tree实例,内附mysql数据文件 1. 数据节点一次性加载 2. 节点分为两个类(项目和设备) 3. 右键菜单 4. 节点增、删、改操作 ....... 后台是java struts1。 本例旨在说明extjs的tree操作,后台操作很简陋...

    Extjs Tree + JSON + Struts2 示例源代码

    ExtJS Tree + JSON + Struts2 示例源代码是结合了三种技术来实现一个动态的、交互式的树形数据展示的应用。这个示例中,ExtJS用于前端UI的构建,JSON作为数据交换格式,而Struts2则作为后端MVC框架处理请求和返回...

    extjs-tree.zip_extjs tree

    ExtJS Tree是一个强大的JavaScript库,专门用于创建交互式的树形结构。这个"extjs-tree.zip"文件包含了使用Java编写的ExtJS异步树形控件的示例代码,旨在帮助开发者快速理解和应用这一功能。ExtJS是Sencha公司开发的...

    获取Extjs中的TreePanel中所有的被checked的叶子节点的id

    在本篇文章中,我们将深入探讨如何在ExtJS框架中获取TreePanel中所有被选中(checked)的叶子节点的ID。此技术对于处理复杂的数据结构、优化用户交互体验以及实现高效的数据管理至关重要。 ### 一、ExtJS简介 ...

    Extjs Tree + JSON + Struts2 例子

    通过这种方式,我们解决了 Struts2 JSON 插件返回数据格式与 ExtJS Tree 期待格式不匹配的问题。现在,树形菜单应该能够正确地动态加载并显示从服务器获取的数据。这个例子展示了如何在实际开发中灵活应对数据格式...

    ExtJs_TreeDemo

    - `itemclick`: 节点被点击时触发。 - `beforeexpand`: 节点展开前触发,可进行验证或阻止展开。 - `expand`: 节点展开后触发。 - `beforecollapse`: 节点折叠前触发。 - `collapse`: 节点折叠后触发。 5. **...

    extjs ajax tree(js动态树,无需递归)

    ExtJS AJAX Tree是一种基于JavaScript的动态树形结构,它利用AJAX技术来异步加载节点数据,无需在服务器端生成完整的树结构。这种方式可以显著提高页面加载速度,尤其是在处理大量数据时。ExtJS是一个功能丰富的...

    带复选框的 ExtJs tree

    在给定的文件中,我们关注的是“带复选框的ExtJS tree”这一主题,这涉及到ExtJS框架下的树形组件(TreePanel)如何与复选框结合,为用户提供更为灵活的数据选择和管理方式。 ### 标题解析:“带复选框的ExtJS tree...

    ExtJS Tree教程及例子代码

    ExtJS Tree组件提供了丰富的功能和自定义选项,包括节点的拖放操作、异步加载、复选框、分页以及各种事件监听等。 本教程旨在帮助开发者深入理解和熟练运用ExtJS Tree。通过eclipse项目导入提供的源码,你可以看到...

Global site tag (gtag.js) - Google Analytics