bootstrap-treeview 實現級聯選擇


該方式通過修改源碼:

/*以下方法被改動,調用時要特別注意 2019-09-11 zhoujunming3*/
Tree.prototype.toggleCheckedState = function (node, options) {
if (!node) return;
//this.setCheckedState(node, !node.state.checked, options);
this.setCheckedChildrenState(node, !node.state.checked, options);
if(node.state.checked) {
this.setCheckedParentState(node, node.state.checked, options);
}
if(!node.state.checked){
this.setUnCheckedParentState(node, node.state.checked, options);
}
};

Tree.prototype.setCheckedChildrenState = function(node, state, options) {
this.setCheckedState(node, state, options);
if(node.nodes !== undefined && node.nodes.length > 0) {
for(let i = 0,len=node.nodes.length; i < len; i++) {
this.setCheckedChildrenState(node.nodes[i], node.state.checked, options);
}
}
};

Tree.prototype.setCheckedParentState = function(node, state, options) {
this.setCheckedState(node, state, options);
if(node.parentId !== undefined) {
let parent_ = this.nodes[node.parentId];
this.setCheckedParentState(parent_, state, options);
}

};

Tree.prototype.setUnCheckedParentState = function(node, state, options) {
let flag = true;
if (node.parentId !== undefined) {
let parent_ = this.nodes[node.parentId];
for (let i = 0, len = parent_.nodes.length; i < len; i++) {
if (parent_.nodes[i].state.checked) {
flag = false;
break;
}
}
if(flag){
this.setCheckedState(parent_, state, options);
this.setUnCheckedParentState(parent_, state, options);
}
}

}
/*以上方法被改動,調用時要特別注意*/

還有一種通過外部渲染進行級聯選擇,這種方式數據量大時渲染較慢,上邊是自己的后期實現

核心方法

 
        
var nodeCheckedSilent = false; 
function nodeChecked (event, node){ 
 if(nodeCheckedSilent){ 
  return; 
 } 
 nodeCheckedSilent = true; 
 checkAllParent(node); 
 checkAllSon(node); 
 nodeCheckedSilent = false; 
} 
 
var nodeUncheckedSilent = false; 
function nodeUnchecked (event, node){ 
 if(nodeUncheckedSilent) 
  return; 
 nodeUncheckedSilent = true; 
 uncheckAllParent(node); 
 uncheckAllSon(node); 
 nodeUncheckedSilent = false; 
} 
 
//選中全部父節點 
function checkAllParent(node){ 
 $('#searchTree').treeview('checkNode',node.nodeId,{silent:true}); 
 var parentNode = $('#searchTree').treeview('getParent',node.nodeId); 
 if(!("nodeId" in parentNode)){ 
  return; 
 }else{ 
  checkAllParent(parentNode); 
 } 
} 
//取消全部父節點 
function uncheckAllParent(node){ 
 $('#searchTree').treeview('uncheckNode',node.nodeId,{silent:true}); 
 var siblings = $('#searchTree').treeview('getSiblings', node.nodeId); 
 var parentNode = $('#searchTree').treeview('getParent',node.nodeId); 
 if(!("nodeId" in parentNode)) { 
  return; 
 } 
 var isAllUnchecked = true; //是否全部沒選中 
 for(var i in siblings){ 
  if(siblings[i].state.checked){ 
   isAllUnchecked=false; 
   break; 
  } 
 } 
 if(isAllUnchecked){ 
  uncheckAllParent(parentNode); 
 } 
 
} 
 
//級聯選中所有子節點 
function checkAllSon(node){ 
 $('#searchTree').treeview('checkNode',node.nodeId,{silent:true}); 
 if(node.nodes!=null&&node.nodes.length>0){ 
  for(var i in node.nodes){ 
   checkAllSon(node.nodes[i]); 
  } 
 } 
} 
//級聯取消所有子節點 
function uncheckAllSon(node){ 
 $('#searchTree').treeview('uncheckNode',node.nodeId,{silent:true}); 
 if(node.nodes!=null&&node.nodes.length>0){ 
  for(var i in node.nodes){ 
   uncheckAllSon(node.nodes[i]); 
  } 
 } 
} 
 
        

6-27 : 經部分網友反饋,圖中的 if(!("id" in perentNode)) 需要改成 if(!("nodeId" in perentNode))才能正常運行,我想應該是版本問題,上面代碼中已經改正了。如果運行不了,請改回 if(!("id" in perentNode))試一下。(謝謝大家提出)
因為treeview中silent屬性指定了無效(我也不知道為什么委屈),所以多加了兩個變量來控制

 
        
$('#searchTree').treeview({ 
  showCheckbox:true, 
  data:treeData, 
  onNodeChecked:nodeChecked , 
  onNodeUnchecked:nodeUnchecked 
 }); 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM