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{
			//頂級節點中單獨處理
		}
	}*/
}

 

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