Bootstrap Tree View,简单而优雅的树结构组件(2)

简介: Bootstrap Tree View,简单而优雅的树结构组件

####④、拿到数据之后,就可以对treeview进行初始化了。


这里,我们讲一点更复杂的应用,如下图。

image.png


如果用户已经保存过一部分节点,那么初次展示的时候就需要通过treeview展示出来了。

我们定一些规则:


节点全部选中时color为red,check框选中。

节点未全部选中时color为red,check框未选中。

节点一个也没选中时color为默认,check框未选中。

为此,我们需要增加一点css。


/* 树形省市 */
.treeview .list-group-item.node-checked {
  color: red;
}
.treeview .list-group-item.node-selected {
  color: red;
}


有了这个规则,我们在初次展开treeview的时候,就需要重新制定以下数据规则。

// 省市级数据
var procityTreeData = YUNM._set.procityTreeData;
// 用户已经选中的城市,比如河南洛阳。
var init_code = $this.next("input[name=area]").val();
// 如果用户有选中项,则对选中项进行规则展示
if (init_code) {
  // 初始化选中项目
  $.each(procityTreeData, function(index, value) {
    // 通过i和省级的节点length进行对比,判断是否全选、未全选、全未选三种状态
    var i = 0;
    $.each(value.nodes, function(index1, value1) {
      if (init_code.indexOf(value1.code) != -1) {
        // 选中时先初始化state,再把state.checked设为true
        value1["state"] = {};
        value1["state"]["checked"] = true;
        i++;
      } else {
        // 否则重置state,保证procityTreeData数据的不被更改
        // 这个地方其实有待优化,由于js我还不算精通,所以不知道怎么把数组复制到一个新数组里,保证原始属于不被更改
        value1["state"] = {};
      }
    });
    value["state"] = {};
    // 市级节点有选中,那么省级节点的状态需要变化,根据上面制定的规则来
    if (i > 0) {
      // 市级全选,那么此时省级节点打钩
      if (value.nodes.length == i) {
        value["state"]["checked"] = true;
      }
      // 根据selected来设定颜色
      value["state"]["selected"] = true;
    } else {
      value["state"]["selected"] = false;
    }
  });
}


让treeview和我们打个招呼吧!


$("#procitytree").treeview({
  data : procityTreeData,// 赋值
  highlightSelected : false,// 选中项不高亮,避免和上述制定的颜色变化规则冲突
  multiSelect : false,// 不允许多选,因为我们要通过check框来控制
  showCheckbox : true,// 展示checkbox
  }).treeview('collapseAll', {// 节点展开
  silent : true
});


####⑤、节点onNodeChecked、onNodeUnchecked的应用

不要⑤就够了吗?

不够,我们还要控制节点选择框的变化。

就像效果图中那样。

image.png

image.png

onNodeChecked : function(event, node) {
  YUNM.debug("选中项目为:" + node);
  // 省级节点被选中,那么市级节点都要选中
  if (node.nodes != null) {
    $.each(node.nodes, function(index, value) {
      $this.treeview('checkNode', value.nodeId, {
        silent : true
      });
    });
  } else {
    // 市级节点选中的时候,要根据情况判断父节点是否要全部选中
    // 父节点
    var parentNode = $this.treeview('getParent', node.nodeId);
    var isAllchecked = true; // 是否全部选中
    // 当前市级节点的所有兄弟节点,也就是获取省下面的所有市
    var siblings = $this.treeview('getSiblings', node.nodeId);
    for ( var i in siblings) {
      // 有一个没选中,则不是全选
      if (!siblings[i].state.checked) {
        isAllchecked = false;
        break;
      }
    }
    // 全选,则打钩
    if (isAllchecked) {
      $this.treeview('checkNode', parentNode.nodeId, {
        silent : true
      });
    } else {// 非全选,则变红
      $this.treeview('selectNode', parentNode.nodeId, {
        silent : true
      });
    }
  }
},
onNodeUnchecked : function(event, node) {
  YUNM.debug("取消选中项目为:" + node);
  // 选中的是省级节点
  if (node.nodes != null) {
    // 这里需要控制,判断是否是因为市级节点引起的父节点被取消选中
    // 如果是,则只管取消父节点就行了
    // 如果不是,则子节点需要被取消选中
    if (silentByChild) {
      $.each(node.nodes, function(index, value) {
        $this.treeview('uncheckNode', value.nodeId, {
          silent : true
        });
      });
    }
  } else {
    // 市级节点被取消选中
    var parentNode = $this.treeview('getParent', node.nodeId);
    var isAllUnchecked = true; // 是否全部取消选中
    // 市级节点有一个选中,那么就不是全部取消选中
    var siblings = $this.treeview('getSiblings', node.nodeId);
    for ( var i in siblings) {
      if (siblings[i].state.checked) {
        isAllUnchecked = false;
        break;
      }
    }
    // 全部取消选中,那么省级节点恢复到默认状态
    if (isAllUnchecked) {
      $this.treeview('unselectNode', parentNode.nodeId, {
        silent : true,
      });
      $this.treeview('uncheckNode', parentNode.nodeId, {
        silent : true,
      });
    } else {
      silentByChild = false;
      $this.treeview('selectNode', parentNode.nodeId, {
        silent : true,
      });
      $this.treeview('uncheckNode', parentNode.nodeId, {
        silent : true,
      });
    }
  }
  silentByChild = true;
},

到这里,treeview的应用已经算是非常全面了,我想你一定也会应用了,不会的话,再来找我啊!

相关文章
N..
|
2月前
|
开发框架 前端开发 UED
Bootstrap的CSS组件
Bootstrap的CSS组件
N..
23 0
|
9月前
|
前端开发 容器
|
9月前
|
前端开发 容器
|
9月前
|
前端开发 开发者 容器
|
2月前
|
前端开发
bootstrap组件的案例代码
bootstrap组件的案例代码
|
2月前
|
前端开发
bootstrap组件
bootstrap组件
|
2月前
Bootstrap5 导航组件和面包屑
Bootstrap5 导航组件和面包屑
31 0
|
2月前
|
前端开发 JavaScript 容器
BootStrap 组件和样式
BootStrap 组件和样式
48 0
|
9月前
|
前端开发 容器
|
9月前
|
Web App开发 前端开发 容器