• bootstrap-treeview 增删改查



    效果图:


    效果图:

    一、引入文件

    二、增加按钮

    1.后台返回的data 增加 after_html 字段

    2.修改bootstrap-treeview.js

    三、bootstrap-treeview.js增加方法

    1.根据自定义id获取当前节点(getNodeV2 )

    2.添加节点(addNode)

    3.编辑节点(updateNode)

    4.删除节点(deleteNode)

    三、添加(添加节点后,父节点下需要追加刚刚添加的节点)

    效果图:

    1.根据id获取当前节点

     2.添加完成后,后台返回查询到的添加的节点信息,追加到节点后

    四、编辑(编辑节点后,需要更新节点的名称到树,如果编辑了父级,需要重新加载整棵树,然后选中当前编辑节点)

    五、删除(如果删除的节点是父级的唯一子节点,那么删除后,父级的字节点需要清空,如果删除的节点非唯一子节点,那么直接删除)

    总结


    一、引入文件

    1. <script type="text/javascript" src="js/bootstrap.min.js"></script>
    2. <script type="text/javascript" src="js/jquery-1.8.3.js"></script>
    3. <script type="text/javascript" src="js/bootstrap-treeview.js?id=909"></script>

    二、增加按钮

    1.后台返回的data 增加 after_html 字段

    v["after_html"] = fmt.Sprintf("<span class=\"button_z\"><img src='img/add.png' onclick=\"addDoc(%v);\" class='imgbtn' /> <img src='img/edit.png' class='imgbtn' onclick=\"editDoc(%v);\"  /> <img src='img/delete.png'  onclick=\"delDoc(%v);\" class='imgbtn' /></span>", v["id"], v["id"], v["id"])

    "<span class="button_z"><img src='img/add.png' onclick="addDoc(26);" class='imgbtn' /> <img src='img/edit.png' class='imgbtn' onclick="editDoc(26);"  /> <img src='img/delete.png'  onclick="delDoc(26);" class='imgbtn' /></span>"

    2.修改bootstrap-treeview.js

    1. //如果有html内容,增加
    2. if (_this.options.showAfterHtml && node.after_html) {
    3. treeItem.append(node.after_html);
    4. }

    三、bootstrap-treeview.js增加方法

    1.根据自定义id获取当前节点(getNodeV2 )

    1. getNodeV2: $.proxy(this.getNodeV2, this),
    2. Tree.prototype.getNodeV2 = function(id) {
    3. return this.findNodeV2(id);
    4. };
    5. Tree.prototype.findNodeV2 = function(id) {
    6. var _this = this;
    7. return this.nodes.find((item, index) => {
    8. var val = _this.getNodeValueV2(item, id);
    9. if (val != undefined) {
    10. return val;
    11. }
    12. });
    13. };
    14. Tree.prototype.getNodeValueV2 = function(obj, id) {
    15. if (obj.id == id) {
    16. return obj;
    17. } else {
    18. return undefined;
    19. }
    20. };

    2.添加节点(addNode)

    1. Tree.prototype.addNode = function(identifiers, options) {
    2. this.forEachIdentifier(
    3. identifiers,
    4. options,
    5. $.proxy(function(node, options) {
    6. this.setAddNode(node, options);
    7. }, this)
    8. );
    9. this.setInitialStates({ nodes: this.tree }, 0);
    10. this.render();
    11. };
    12. Tree.prototype.setAddNode = function(node, options) {
    13. if (node.nodes == null) node.nodes = [];
    14. if (options.node) {
    15. node.nodes.push(options.node);
    16. }
    17. };

    3.编辑节点(updateNode)

    1. /**
    2. Updates / replaces a given tree node
    3. @param {Object} node - A single node to be replaced
    4. @param {Object} newNode - THe replacement node
    5. @param {optional Object} options
    6. */
    7. Tree.prototype.updateNode = function(identifiers, options) {
    8. this.forEachIdentifier(
    9. identifiers,
    10. options,
    11. $.proxy(function(node, options) {
    12. var parentNode = this.getParent(node);
    13. this.setUpdateNode(parentNode, node, options);
    14. }, this)
    15. );
    16. };
    17. Tree.prototype.setUpdateNode = function(node, newnode, options) {
    18. //当修改最上级的名称时node==undefined
    19. if (node == undefined) {
    20. node = this.tree;
    21. for (var i = this.tree.length - 1; i >= 0; i--) {
    22. console.log("this.tree[i]", this.tree[i]);
    23. var mynode = this.tree[i];
    24. if (mynode.id === newnode.id) {
    25. this.tree[i].text = newnode.text;
    26. this.tree[i].spdd_orderid = newnode.spdd_orderid;
    27. }
    28. }
    29. } else if (node.nodes != null) {
    30. for (var i = node.nodes.length - 1; i >= 0; i--) {
    31. var mynode = node.nodes[i];
    32. if (mynode.id === newnode.id) {
    33. node.nodes[i].text = newnode.text;
    34. node.nodes[i].spdd_orderid = newnode.spdd_orderid;
    35. }
    36. }
    37. }
    38. this.setInitialStates({ nodes: this.tree }, 0);
    39. this.render();
    40. };

    4.删除节点(deleteNode)

    1. Tree.prototype.deleteNode = function(identifiers, options) {
    2. this.forEachIdentifier(
    3. identifiers,
    4. options,
    5. $.proxy(function(node, options) {
    6. var parentNode = this.getParent(node);
    7. this.setDeleteNode(parentNode, node, options);
    8. }, this)
    9. );
    10. };
    11. Tree.prototype.setDeleteNode = function(node, deletenode, options) {
    12. if (node.nodes != null) {
    13. for (var i = node.nodes.length - 1; i >= 0; i--) {
    14. var mynode = node.nodes[i];
    15. if (mynode.id === deletenode.id) {
    16. node.nodes.splice(i, 1);
    17. }
    18. }
    19. this.setInitialStates({ nodes: this.tree }, 0);
    20. this.render();
    21. }
    22. };

    5.根据自定义id默认选中节点(searchV2)

     

    1. Tree.prototype.searchV2 = function(id, options) {
    2. //console.log(" search: $.proxy(this.search, this),", id);
    3. options = $.extend({}, _default.searchOptions, options);
    4. this.clearSearch({ render: false });
    5. var results = [];
    6. results = this.findNodesV2(id);
    7. // Add searchResult property to all matching nodes
    8. // This will be used to apply custom styles
    9. // and when identifying result to be cleared
    10. $.each(results, function(index, node) {
    11. node.searchResult = true;
    12. });
    13. // If revealResults, then render is triggered from revealNode
    14. // otherwise we just call render.
    15. if (options.revealResults) {
    16. this.revealNode(results);
    17. } else {
    18. this.render();
    19. }
    20. this.$element.trigger("searchCompleteV2", $.extend(true, {}, results));
    21. return results;
    22. };
    23. Tree.prototype.findNodesV2 = function(id) {
    24. // modifier = modifier || "g";
    25. // attribute = attribute || "text";
    26. var _this = this;
    27. return $.grep(this.nodes, function(node) {
    28. var val = _this.getNodeValueV2(node, id);
    29. if (val != undefined) {
    30. return val;
    31. //return val.match(new RegExp(pattern, modifier));
    32. }
    33. });
    34. };
    35. Tree.prototype.findNodeV2 = function(id) {
    36. var _this = this;
    37. return this.nodes.find((item, index) => {
    38. var val = _this.getNodeValueV2(item, id);
    39. if (val != undefined) {
    40. return val;
    41. }
    42. });
    43. };

    使用: 

    1. searchNodeByid(id) {
    2. var tempid = this.docDetailid
    3. if (id) {
    4. tempid = id
    5. }
    6. $("#treeview").treeview("searchV2", [
    7. tempid,
    8. {
    9. ignoreCase: true, // case insensitive
    10. exactMatch: false, // like or equals
    11. revealResults: true, // reveal matching nodes
    12. },
    13. ]);
    14. },

    三、添加(添加节点后,父节点下需要追加刚刚添加的节点)

    效果图:

    1.根据id获取当前节点

    	var node = $("#treeview").treeview("getNodeV2", id);


     2.添加完成后,后台返回查询到的添加的节点信息,追加到节点后

    1. $("#treeview").treeview("addNode", [this.model.nodeId, {
    2. node: data.data
    3. }]);

    四、编辑(编辑节点后,需要更新节点的名称到树,如果编辑了父级,需要重新加载整棵树,然后选中当前编辑节点)

    1. if (this.model.old_spdd_parent_id == this.model.spdd_parent_id) {
    2. $('#treeview').treeview('updateNode', [this.model.nodeId, newNode, {
    3. silent: true}]);
    4. } else {//修改了父级,重新加载整棵树
    5. this.initTree(this.model.spdd_id)
    6. }

    五、删除(如果删除的节点是父级的唯一子节点,那么删除后,父级的字节点需要清空,如果删除的节点非唯一子节点,那么直接删除)

    1. if (this.tempParentNode && this.tempParentNode.nodes && this.tempParentNode.nodes.length == 1) {
    2. this.tempParentNode.nodes = null
    3. $('#treeview').treeview('updateNode', [this.tempNode.parentId, this.tempParentNode, {
    4. silent: true
    5. }]);
    6. } else {
    7. $("#treeview").treeview("deleteNode", [this.tempNode.nodeId, {
    8. silent: true
    9. }]);
    10. }

    总结

    treeview参考文档: https://www.jq22.com/jquery-info10461

    由于bootstrap-treeview有很多版本,这里直接上传代码文件:

    https://download.csdn.net/download/lmy_loveF/85824181

  • 相关阅读:
    uni-app 中实现 onLaunch 异步回调后执行 onLoad 最佳实践
    Linux18 ---进程和线程、线程实现方法、线程的使用接口、多线程代码实现、线程并发运行
    ubuntu20.04 创建ros环境、创建rospackage
    行业追踪,2023-10-17
    解决mysql中group_concat长度限制的方案
    noexcept
    python安装selselenium,chromedriver,秒杀脚本教程
    Android11 热点设置永不关闭
    rust包
    神经网络训练的一般步骤,神经网络的训练与测试
  • 原文地址:https://blog.csdn.net/lmy_loveF/article/details/125516464