【问题标题】:How to allow only one selection of checkboxes in kendo treeview / ui for jquery?如何在 jquery 的 kendo treeview / ui 中只允许选择一个复选框?
【发布时间】:2021-09-13 17:41:45
【问题描述】:

我想在 jquery 的 kendo treeview / ui 中将复选框模式设为单一。

但是 jquery 没有官方选项。我找到了扫描所有树视图并一一取消选中其他树视图的解决方案。但这给我带来了麻烦,因为我的树视图中有 3-4 个深度和 +500 多个项目。当我第二次选择时,大约需要 1-2 秒并冻结所有树视图一段时间。 这是我使用的虚拟解决方案的演示。但对于我的实际树视图来说,它并不平滑。

<!DOCTYPE html>
<html>
<head>
    <base href="https://demos.telerik.com/kendo-ui/treeview/index">
    <style>html { font-size: 14px; font-family: Arial, Helvetica, sans-serif; }</style>
    <title></title>
    <link rel="stylesheet" href="https://kendo.cdn.telerik.com/2021.2.616/styles/kendo.default-v2.min.css" />

    <script src="https://kendo.cdn.telerik.com/2021.2.616/js/jquery.min.js"></script>
    
    
    <script src="https://kendo.cdn.telerik.com/2021.2.616/js/kendo.all.min.js"></script>
    
    

</head>
<body>
    <div id="example">
    <div class="demo-section wide k-content">
        <div id="demo-section-title" class="treeview-flex">
            <div>
                <h3>
                    Select nodes, folders and drag them between the TreeViews
                </h3>
            </div>
        </div>
        <div class="treeview-flex">
            <div id="treeview-kendo"></div>
        </div>
        <div class="treeview-flex">
            <div>
                <h4>Drag and Drop</h4>
            </div>
        </div>
        <div class="treeview-flex">
            <div id="treeview-telerik"></div>
        </div>
    </div>
    <script id="treeview" type="text/kendo-ui-template">

        # if (!item.items && item.spriteCssClass) { #
        #: item.text #
        <span class='k-icon k-i-close kendo-icon'></span>
        # } else if(!item.items && !item.spriteCssClass) { #
        <span class="k-sprite pdf"></span>
        #: item.text #
        <span class='k-icon k-i-close telerik-icon'></span>
        # } else if (item.items && item.spriteCssClass){ #
        #: item.text #
        # } else { #
        <span class="k-sprite folder"></span>
        #: item.text #
        # } #
    </script>

    <script>
        function traverse(nodes, callback) {
        for (var i = 0; i < nodes.length; i++) {
          var node = nodes[i];
          var children = node.hasChildren && node.children.data();
          
          callback(node);
          
          if (children) {
            traverse(children, callback);
          }
        }
      }
      
      function onCheck(e) {
        var dataItem = this.dataItem(e.node);

        var rootNodes = $("#treeview-kendo").getKendoTreeView().dataSource.data();

        traverse(rootNodes, function(node) {
          if (node != dataItem) {
            node.set("checked", false);
          }
        });
      }

$("#treeview-kendo").kendoTreeView({
            template: kendo.template($("#treeview").html()),
            dataSource: [{
                id: 1, text: "My Documents", expanded: true, spriteCssClass: "rootfolder", items: [
                    {
                        id: 2, text: "Kendo UI Project", expanded: true, spriteCssClass: "folder", items: [
                            { id: 3, text: "about.html", spriteCssClass: "html" },
                            { id: 4, text: "index.html", spriteCssClass: "html" },
                            { id: 5, text: "logo.png", spriteCssClass: "image" }
                        ]
                    },
                    {
                        id: 6, text: "Reports", expanded: true, spriteCssClass: "folder", items: [
                            { id: 7, text: "February.pdf", spriteCssClass: "pdf" },
                            { id: 8, text: "March.pdf", spriteCssClass: "pdf" },
                            { id: 9, text: "April.pdf", spriteCssClass: "pdf" }
                        ]
                    }
                ]
            }],
            //dragAndDrop: true,
            checkboxes: {
                checkChildren: true
                                
            },
                        check: onCheck,
            loadOnDemand: true
        });

        
       
    </script>
    <style>
        @media screen and (max-width: 680px) {
            .treeview-flex {
                flex: auto !important;
                width: 100%;
            }
        }

        #demo-section-title h3 {
            margin-bottom: 2em;
            text-align: center;
        }

        .treeview-flex h4 {
            color: #656565;
            margin-bottom: 1em;
            text-align: center;
        }

        #demo-section-title {
            width: 100%;
            flex: auto;
        }

        .treeview-flex {
            flex: 1;
            -ms-flex: 1 0 auto;
        }

        .k-treeview {
            max-width: 240px;
            margin: 0 auto;
        }

        #treeview-kendo .k-sprite {
            background-image: url("../content/web/treeview/coloricons-sprite.png");
        }

        #treeview-telerik .k-sprite {
            background-image: url("../content/web/treeview/coloricons-sprite.png");
        }

        .demo-section {
            margin-bottom: 5px;
            overflow: auto;
            display: flex;
            justify-content: space-between;
            flex-wrap: wrap;
        }

        .rootfolder {
            background-position: 0 0;
        }

        .folder {
            background-position: 0 -16px;
        }

        .pdf {
            background-position: 0 -32px;
        }

        .html {
            background-position: 0 -48px;
        }

        .image {
            background-position: 0 -64px;
        }

    </style>
</div>


    

</body>
</html>

Angular 有一个选项模式:“single”。 single mode checkbox for treeview in kendo ui for Angular

但我正在为 Jquery 寻找相同的剑道 ui。

【问题讨论】:

  • 您在每次 traverse 调用时都传递了 function(node) 回调。你试过不通过吗?也许不通过它会使它更快一点。

标签: kendo-ui


【解决方案1】:

您无需手动遍历节点。您可以利用 JQuery 获取适当的选择器,并让它在 check 事件 (documentation) 中为您完成。

基本上你会做的是:

  1. 处理check 事件
  2. 通过选择树视图的k-checkbox-wrapper类'input获取输入
  3. checked 属性设置为false
  4. 将被检查的节点设置回 true

例子:

check: function(e) {
  $("#treeview .k-checkbox-wrapper input").prop("checked", false);
  $(e.node).find("input").prop("checked", true);
}

小提琴:https://dojo.telerik.com/ALEJetoD

【讨论】:

  • 你试过检查旧的吗?这个小提琴有一个错误。检查 3-4 次然后再检查旧的然后你就会明白我的意思了。
  • @user3565914 - 你是对的。我已经玩了很多次,但似乎检查的事件存在错误,因为它没有持续触发。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-04
相关资源
最近更新 更多