`
gtgt1988
  • 浏览: 114262 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

extjs实现级联以及节点的模糊查询

 
阅读更多
Ext.tree.TreeCheckNodeUI 前面是通过这个组件实现的父节点和子节点的级联
但是源码貌似很复杂个人认为,因此不需要通过这个组件实现.
通过以下这两个函数实现类似的功能.
 visitAllTreeNodeFun(node, checked);
           if (node.parentNode && node.parentNode.getUI().checkbox != null) {
                 checkParentFun(node.parentNode);
               }
但是遇到个新问题,当获取选中的节点时候,只能获取鼠标点击的那个节点,比如点击某一子节点,相关联
的父节点被选中,但是父节点获取不到,级联的相关联节点都获取不到,查询相关资料,改正此处
 treeNode.childNodes[i].ui.toggleCheck(checked);//选中
需要先选中,再赋值,才可以获取选中的节点,加上上面的红色那句话就可以了.此时又有个新问题
选中事件发生在子节点,但要通过toggleCheck()改变其父节点未被选中的状态,而一旦改变了父节点未被选中状态为选中状态,就会激发树中的<CheckChange Handler="check(node)" />事件
,每次激发,传入的节点值node一直在改变,陷入一个死循环。
因此要加入suspendEvents()停止监听事件,执行完后再恢复监听

          


Ext.onReady(function() {
	Ext.QuickTips.init();
	this.tree = new Ext.tree.TreePanel({
		id:'tree',
	    region: 'center',
	    autoScroll: true,
	    animate: true,
	    width: '280',
	    collapsible: (this.centerRegion=='center' ?  false : true),
	    split: true,
//	    tbar: [{xtype:"button",text:"logout",listeners:{ "click":function(){ssd(); }}
//	     }],
	    tbar:[' ',  
	                         new Ext.form.TextField({  
	                               width:150,  
	                               emptyText:'快速检索',  
	                                enableKeyEvents: true,  
	                                listeners:{  
	                                	keyup:function(node, event) {  
	                                  findByKeyWordFiler(node, event);  
	                                },  
                         }  
	                        })  
	                 ],  

	    enableDD: true,
	  //  checkModel: 'cascade',    //对树的级联多选
	   // onlyLeafCheckable: false,//对树所有结点都可选
	    containerScroll: true,
	    border: false,
	    loader: new Ext.tree.TreeLoader({
	    	url:'/neFunction/test',
	    	//baseAttrs: { uiProvider: Ext.tree.TreeCheckNodeUI }//解决了获取树节点的级联多选问题
	    	 }),
		root: new Ext.tree.AsyncTreeNode({
			id: "0",
			level: "0",
			text:"菜单树"
			}),
		  listeners: {
		        'checkchange': function (node, checked) {
		        	tree.suspendEvents(); //暂停所有监听事件的执行
		        
		        	visitAllTreeNodeFun(node, checked);
		        	if (node.parentNode && node.parentNode.getUI().checkbox != null) {
			              checkParentFun(node.parentNode);
			            }
		        	tree.resumeEvents(); //重新开始所有监听事件的执行
	        }
		    },
	
		rootVisible: true
	});
	
	this.tree.getRootNode().expand();
	this.tree.addListener("click",this.ClickNode);
	this.contextMenu = new Ext.menu.Menu({
		 id:"treeContextMenu",
		 items:[
	        {
	        	text:"查看",
	        	handler:function() {
	        		Ext.Msg.alert("...",Ext.getCmp('tree').getSelectionModel().getSelectedNode().id);
	 }
	 }      
	 ]
	 
	});

	this.tree.on("contextmenu",function(node,e) {
		 e.preventDefault(); // 阻止弹出默认右键菜单
		 node.select(); // 选中节点
		 Ext.getCmp("treeContextMenu").showAt(e.getXY());
	 
	});
	
	
	 var timeOutId = null;  
 
          var treeFilter = new Ext.tree.TreeFilter(tree, {  
	              clearBlank : true,  
               autoClear : true  
          });  
 
         // 保存上次隐藏的空节点  
           var hiddenPkgs = [];  
            var findByKeyWordFiler = function(node, event) {  
               clearTimeout(timeOutId);// 清除timeOutId  
               tree.expandAll();// 展开树节点  
              // 为了避免重复的访问后台,给服务器造成的压力,采用timeOutId进行控制,如果采用treeFilter也可以造成重复的keyup  
               timeOutId = setTimeout(function() {  
                   // 获取输入框的值  
                   var text = node.getValue();  
                 // 根据输入制作一个正则表达式,'i'代表不区分大小写  
                  var re = new RegExp(Ext.escapeRe(text), 'i');  
                 // 先要显示上次隐藏掉的节点  
	                   Ext.each(hiddenPkgs, function(n) {  
                       n.ui.show();  
                  });  
                  hiddenPkgs = [];  
                 if (text != "") {  
                      treeFilter.filterBy(function(n) {  
	                           // 只过滤叶子节点,这样省去枝干被过滤的时候,底下的叶子都无法显示  
                           return !n.isLeaf() || re.test(n.text);  
                      });  
                       // 如果这个节点不是叶子,而且下面没有子节点,就应该隐藏掉  
                     tree.root.cascade(function(n) {  
                           if(n.id!='0'){  
                                if(!n.isLeaf() &&judge(n,re)==false&& !re.test(n.text)){  
                                   hiddenPkgs.push(n);  
                                 n.ui.hide();  
                              }  
                           }  
                       });  
                  } else {  
                       treeFilter.clear();  
                       return;  
	                   }  
	                }, 500);  
           }; 
          // 过滤不匹配的非叶子节点或者是叶子节点  
           var judge =function(n,re){  
               var str=false;  
               n.cascade(function(n1){  
	                   if(n1.isLeaf()){  
                       if(re.test(n1.text)){ str=true;return; }  
                    } else {  
                       if(re.test(n1.text)){ str=true;return; }  
	                  }  
	              });  
               return str;  
          };  


	
	new Ext.Viewport({
		renderTo:Ext.getBody(),
		layout : 'border',
		autoShow:true,
	    items: [this.tree]
	});
});


function ClickNode(node){
	console.info(node.attributes.id);
}


/** 父节点的选择 */
  function checkParentFun (treeNode) {
    var i;
    var check = false;
    var nocheck = false;
    if (treeNode.hasChildNodes()) {
        for (i = 0; i < treeNode.childNodes.length; i++) {
            if (treeNode.childNodes[i].getUI().checkbox.checked) {
                check = true;
            } else {
                nocheck = true;
            }
        }
    }
  if (check == true && nocheck == false) { // 可以全选
        treeNode.getUI().checkbox.checked = true;

      
    } else if (check == true && nocheck == true) { // 半选  孩子节点既有选中的也有未选中的 这种情况则父节点还是选中
    	treeNode.ui.toggleCheck(true);
      treeNode.getUI().checkbox.checked = true;
    
    
        if(treeNode.parentNode&& treeNode.parentNode.getUI().checkbox != null){
    		
    		checkParentFun(treeNode.parentNode);
    	}
      
    } else if (check == false && nocheck == true) { // 全不选     孩子节点都是未选中的则父节点取消选中
    	treeNode.ui.toggleCheck(false);
    	treeNode.getUI().checkbox.checked = false;
    
        treeNode.collapse();//父节点收缩
    	if(treeNode.parentNode&& treeNode.parentNode.getUI().checkbox != null){
      		checkParentFun(treeNode.parentNode);
      	}
    }
    
};

/** 孩子节点的选择 */
function visitAllTreeNodeFun (treeNode,checked) {
    var i;
    checked ? treeNode.expand() : treeNode.collapse();//点击某一节点让子节点都展开全部展开
    if (treeNode.hasChildNodes()) {
        for (i = 0; i < treeNode.childNodes.length; i++) {
            if (treeNode.childNodes[i].getUI().checkbox) {
               
          	treeNode.childNodes[i].ui.toggleCheck(checked);//选中
          	treeNode.childNodes[i].getUI().checkbox.checked = checked;//
             visitAllTreeNodeFun(treeNode.childNodes[i],checked);
}
}

}
};


/** 根据路径对于节点的选择以及获取选中的节点 */
function  ssd(){
	tree.expandPath("/0/201/401/511");//
	var treeNode = Ext.getCmp("tree").getNodeById("511");
	 if (treeNode) {
    	treeNode.getUI().checkbox.checked = true;
     }
	 
	 var checkedNodes = Ext.getCmp("tree").getChecked();
	 var s = [];
	 for (var i = 0; i < checkedNodes.length; i++) {
		 s.push(checkedNodes[i].text);
	}
	 alert(s);
    	
}




 

分享到:
评论

相关推荐

    ExtJS4.2 tree 级联选择

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

    extJs ComboBox级联

    实现ExtJS ComboBox级联的关键在于理解其数据绑定和事件监听机制。以下是一些关键知识点: 1. **数据源**:ComboBox的数据通常来自一个远程服务器或者本地数据结构,如Store。Store负责加载和管理数据,它可以是...

    extjs mvvm增删查改模糊查询

    在这个"extjs mvvm增删查改模糊查询"主题中,我们将深入探讨如何使用ExtJS的MVVM模式来实现对数据的操作,包括添加、删除、修改和查找,同时结合模糊查询功能,提高用户体验。 首先,MVVM模式的核心在于ViewModel层...

    Extjs动态树的实现以及节点拖拽

    在本文中,我们将探讨如何实现ExtJS动态树以及其中的节点拖拽功能。动态树是一种能够实时更新和修改的树形结构,允许用户添加、删除和移动节点。这种功能在各种应用场景中非常有用,如文件系统、组织结构或层级数据...

    ExtJs4.1.1a 异步树&级联选择

    说明:本例主要实现在树节点数据过多的情况下对数据进行异步请求,并且在请求数据返回前台的同时实现级联选择。使用ExtJs版本为4.1.1a,在struts2下测试通过。例子仅供提供思路,简单易懂,不负责代码优化,哈哈!

    EXTJS的COMBOBOX级联实现和数据提交VALUE[文].pdf

    总结来说,EXTJS的ComboBox级联实现涉及了Store、Proxy、JsonReader、事件监听以及ComboBox的配置选项。通过合理设置这些组件和属性,可以构建出具有动态联动效果的下拉菜单,同时确保在数据提交时正确地传递选定的...

    Extjs4下拉树菜单ComboBoxTree支持单选和多选并且支持展开选中指定节点的通用控件

    在这个特定的情况下,我们讨论的是一个定制的下拉树菜单控件——ComboBoxTree,它在ExtJS4中实现了单选和多选功能,并且具备展开选中指定节点的能力。这个控件在实际项目中已经被广泛使用并证明了其稳定性和实用性,...

    弥补ExtJs CheckboxSelectionModel不能级联的自定义控件

    3. **扩展CheckboxSelectionModel**:自定义控件可能通过继承并扩展ExtJS的CheckboxSelectionModel,添加必要的功能,如`cascadeSelect`和`cascadeDeselect`方法,来实现级联操作。 4. **渲染逻辑**:控件可能需要...

    extJs4 ComboBox组合框实例

    extJs4 ComboBox 代码组合框实例,ComboBox 各个主要参数详细解释

    extjs实现动态树

    在ExtJS中,这种功能主要通过`Ext.tree.TreePanel`或其现代版本`Ext.tree.View`来实现。 一、ExtJS 动态树基础 1. `Ext.tree.TreePanel`:这是ExtJS中用于创建树形结构的主要组件。它具有丰富的配置项和事件,支持...

    Ext TreePanelrcheckbox级联选择的实现

    总之,“Ext TreePanelrcheckbox级联选择的实现”涉及了ExtJS的TreePanel组件和复选框模型的使用,通过监听事件和自定义逻辑实现了节点间的选择级联。这种功能在具有层级结构的数据选择场景中非常常见,如权限管理、...

    ExtJS 设置级联菜单的默认值

    本文将详细介绍如何使用ExtJS框架设置级联菜单的默认值。首先,需要明白在ExtJS中设置普通控件(如文本框)的默认值相对简单,通常只用一行代码即可完成。然而,对于ComboBox(下拉列表组件)来说,情况就没那么简单...

    extjs实现的带标签、翻页动画的书

    在这个目录下,你可能会找到`.js`文件,里面包含了实现上述功能的ExtJS代码,以及可能的HTML和CSS文件来展示这个应用。开发者可能通过阅读这些代码,了解如何将ExtJS组件和动画结合起来,以创建具有翻页效果的电子书...

    ExtJS 自定义树组件 节点的操作 搜索 右键菜单

    功能: 1.实现ExtJS tree 节点右键菜单 实现增删查. 2.实现针对实体数据的动态搜索. 3.代码命名规范,简单易懂. 4.支持IE 9,FF 19.0.2. 5.将文件解压至ext包example任意组件文件夹即可浏览效果.

    ExtjS实现聊天功能

    在这个"ExtJS实现聊天功能"的项目中,我们将探讨如何利用ExtJS框架构建一个类似于QQ的聊天应用程序。 首先,我们要理解聊天功能的核心要素。一个基本的聊天应用通常包含以下部分: 1. **用户界面**:ExtJS提供了...

    Ext 树的级联选择扩展插件使用说明

    级联选择(Cascading Selection)则是指当用户选中一个节点时,其所有子节点都会自动被选中,反之,如果取消选中父节点,所有子节点也会随之被取消选中。这种功能在组织结构、文件系统或权限管理等场景下非常有用。 ...

    Extjs 轻松实现下拉框联动

    最近小弟做了Extjs实现实现下拉框联动的效果,参考了好久才学会,闲下来发一个简单的例子。。呵呵

    extjs实现增删查改

    总结来说,“extjs实现增删查改”涵盖了前端使用ExtJS组件进行数据操作,以及后端使用servlet、Spring和Hibernate进行数据处理的技术栈。这个过程涉及到了前端交互设计、数据模型管理、HTTP通信和数据库操作等多个...

    extjs2.0 画的一个带查询条件和查询结果的页面

    综上所述,"extjs2.0 画的一个带查询条件和查询结果的页面"涉及到的技术点主要包括ExtJS的组件使用、表单创建、事件处理、数据网格展示、Ajax通信以及布局管理。通过熟练掌握这些知识点,可以创建出功能完备且用户...

    Extjs 中的 Treepanel 实现菜单级联选中效果及实例代码

    需要注意的是,实例代码的介绍以及功能的实现都需要依赖于ExtJS框架的API以及面向对象编程的相关知识。只有熟悉了ExtJS框架中TreePanel组件的使用,才能够更好地理解和运用这些方法来开发具有复杂交互的Web应用程序...

Global site tag (gtag.js) - Google Analytics