easyui treegrid只显示指定条件的节点(要保留树结构)

//加载符合条件的节点
function filterForMouseover(name){
    var allData = $("#reviewTable").treegrid('getData');//获取树结构的顶级节点集合
	if(allData){
		if(name == '合格'){
			beforeFilter(allData,1);
		}else if(name == '不合格未扣分'){
			beforeFilter(allData,2);
		}else if(name == '不合格扣分'){
			beforeFilter(allData,3);
		}else{
            //加载全部
			var loadData = {};
			loadData.data = allData.rows;
			$('#reviewTable').treegrid('loadData',loadData);
		}
	}
}

function beforeFilter(allData,status){
	//拷贝对象(不能直接使用allData ,这样会改变allData )
	var allDataCopy = JSON.parse(JSON.stringify(allData));
	var rows = allDataCopy.rows ; 
	
	for(var k = rows.length - 1 ; k >= 0; k-- ){
		var root = rows[k];
        //子节点是否满足条件,在递归中进行判断
		filterDataByStatus(root,status,k,null,rows);
        var children = root.children;//顶级节点的是否满足条件,由下面进行判断
		if(children.length == 0 && root.mystate != status){
			rows.splice(k,1);
		}
	}
	var loadData = {};
	loadData.data = rows;
	$('#reviewTable').treegrid('loadData',loadData);
}

/**
 * 把节点中不符合规则的机率过滤,但是如果子节点符合条件,父节点不符合,父节点也要显示出来,要保留树结构
 * 需要注意的是:子节点都会被递归,如果子节点的chldren为0,并且不符合条件,那么在递归子节点之后,会被父节点删除
 * if(child.children.length > 0 ){
		//处理子节点数据
		filterDataByStatus(child,status,i,row,rows);
   	}
 	//如果子节点没有子节点了,并且子节点不符合要求,则父节点将子节点删除
	if(child.children.length == 0 && child.mystate != status){
		row.children.splice(i,1);
	}
 *  所以子节点的删除由其父节点控制,只有顶级节点需要额外判断
 * @param row 当前树节点
 * @param status 需要过滤的数值
 * @param myIndex status 等于myIndex的节点才需要保留
 * @param parent row的父节点,如果parent为null,则row为顶级节点,其父节点为rows
 * @param rows 顶级节点的集合
 * @returns
 */
function filterDataByStatus(row,status,myIndex,parent,rows){
	var children = row.children;
	if(children.length > 0 ){
		for(var i = children.length -1 ; i >= 0 ; i--){
			var child = children[i];
			if(child.children.length > 0 ){
				//处理子节点数据
				filterDataByStatus(child,status,i,row,rows);
			}
			//如果子节点没有子节点了,并且子节点不符合要求,则父节点将子节点删除
			if(child.children.length == 0 && child.mystate != status){
				row.children.splice(i,1);
			}
		}
		//这里不能这么写,会删除parent.children中保留的正确的节点,因为子节点已经在循环里面由父节点删除了(row.children.splice(i,1);),当前这个row如果有父节点,那么会在父节点的for(var i = children.length -1 ; i >= 0 ; i--){..}
		//执行row.children.splice(i,1)删除的.这里再执行删除,那么就是从parent.children中再删除下标为myIndex的节点,myIndex这个节点已经不是当前的row节点了,而是row节点的下一个节点(所以只要判断如果节点有父节点,那么会被父节点递归子节点删除)
		//如果是顶级节点,才要额外判断
		/*if(children.length == 0 && child.mystate != status){
			parent.children.splice(myIndex,1);
		}*/
	}/*else{ //这个也是不需要的,不符合要求的子节点会由父节点循环子节点的时候删除,顶级节点循环中也单独做了判断
		if(parent){
			parent.children.splice(myIndex,1);
		}else{
			//顶级节点中单独处理
		}
	}*/
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章