Как выбрать все дочерние узлы при выборе родителя в кендо TreeList? javascript - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь выбрать дочерние узлы на родительском узле нажал. Я не мог найти пример для выбора API. Должен ли я использовать вместо этого флажок?

<button id="btn">Highlight third row</button>
<div id="treeList"></div>
<script>
  $("#treeList").kendoTreeList({
    columns: [
      { field: "id" },
      { field: "name" },
      { field: "age" }
    ],
    dataSource: [
      { id: 1, parentId: null, name: "Jane Doe", age: 22, expanded: true },
      { id: 2, parentId: 1, name: "John Doe", age: 24 },
      { id: 3, parentId: 1, name: "Jenny Doe", age: 3 }
    ],
    selectable: "multiple row"
  });

</script>

Я пытаюсь сделать это, если выберите «1» (верхний родитель), выберите 2,3 (дочерние узлы). Надеюсь, что есть нативное решение для javascript реализации. Спасибо за совет!

1 Ответ

0 голосов
/ 01 марта 2020

Состояние выбора поддерживается TreeList в рендеринге строки элементов данных <tr k-state-selected>, и это состояние не отражается в TreeList dataSource. Кроме того, источник данных является единственным местом, где обнаруживаются дочерние отношения. Таким образом, есть немного вперед и назад, чтобы иметь дело с выборами и потомками.

Также TreeList не имеет события select, такого как TreeView, поэтому из коробки вы не знаете, какие узлы были выбран или отменен.

Событие change возникает, когда одно действие приводит к тому, что одна или несколько строк (как может сделать нажатие Shift) выбираются или отменяются. В вашем обработчике change вы можете узнать текущее состояние всех выбранных строк, используя метод select().

Таким образом, в change вам нужно отслеживать предыдущее состояние выбора и текущее состояние выбора, чтобы найти которые строк изменили состояние выбора, что позволило бы их дочерним элементам быть выбранными или отменить выбор в соответствии с вашими требованиями.

См. Этот Dojo для примера. Это не идеально, потому что в событии change вы можете только определить выбранные узлы и не знать, произошел ли «повторный выбор» (т.е. снова щелкнуть выбранную строку). В любом случае, спуск по иерархии TreeList выполняется рекурсивно и опирается на dataSource свойство элемента данных .hasChildren и метод dataSource .childNodes()

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>TreeList select (change)</title>

  <link rel="stylesheet" href="https://kendo.cdn.telerik.com/2020.1.219/styles/kendo.common.min.css">
  <link rel="stylesheet" href="https://kendo.cdn.telerik.com/2020.1.219/styles/kendo.rtl.min.css">
  <link rel="stylesheet" href="https://kendo.cdn.telerik.com/2020.1.219/styles/kendo.default.min.css">
  <link rel="stylesheet" href="https://kendo.cdn.telerik.com/2020.1.219/styles/kendo.mobile.all.min.css">

  <script src="https://code.jquery.com/jquery-1.12.3.min.js"></script>
  <script src="https://kendo.cdn.telerik.com/2020.1.219/js/angular.min.js"></script>
  <script src="https://kendo.cdn.telerik.com/2020.1.219/js/jszip.min.js"></script>
  <script src="https://kendo.cdn.telerik.com/2020.1.219/js/kendo.all.min.js"></script></head>
<body>
  <p><a target="_blank" href="https://docs.telerik.com/kendo-ui/api/javascript/ui/treelist">TreeList docs</a></p>
  <div id="treeList"></div>
<script>
  selected_uids = [];              // track selected uids
  autoselecting = false;

  $("#treeList").kendoTreeList({
    columns: [
      { field: "id" },
      { field: "name" },
      { field: "age" }
    ],
    dataSource: [
      { id: 1, parentId: null, name: "Jane Doe", age: 22, expanded: false },
      { id: 2, parentId: 1, name: "John Doe", age: 24 },
      { id: 3, parentId: 1, name: "Jenny Doe", age: 3 },
      { id: 4, parentId: null, name: "Jane Mack", age: 22, expanded: false },
      { id: 5, parentId: 4, name: "John Mack", age: 24 },
      { id: 6, parentId: 4, name: "Jenny Mack", age: 3 }      
    ],
    selectable: "multiple row",
      change: function(e) {
      if (autoselecting) {
        e.preventDefault();
        return;
      }

      debugger;

      autoselecting = true;

      var selected_rows = this.select();
      console.log ('desel',selected_rows, selected_uids);

      // check for new deselections
      for (var index = 0; index < selected_uids.length; index++) {
        var selected_uid = selected_uids[index];
        if (selected_uid) {
            var row = $("tr[data-uid='" + selected_uid + "'].k-state-selected");
          if (row.length == 0) {
            // no such selected row for one that was previously tracked as selected
            deselectChildren(this, selected_uid);
            selected_uids[index] = null; // untrack
          }
        }
      }

      var selected_rows = this.select();
      console.log ('sel',selected_rows,selected_uids);

      // check for new selections
      for (var index = 0; index < selected_rows.length; index++) {        
        var data = this.dataItem(selected_rows[index]);
        console.log('data',data);
        if (jQuery.inArray(data.uid, selected_uids) == -1) { 
          // new selection
          selected_uids.push(data.uid);
          selectChildren(this, data);
        }
      }

      for (var i=0, j=0; i < selected_uids.length; i++) {
        if (selected_uids[i] != null) {
          if (i > j) {
            selected_uids[j] = selected_uids[i];
          }
          j++;
        }
      }

      selected_uids.length = j;

      autoselecting = false;
    },
  });

  function selectChildren(treeList, data) {
    if (!data.hasChildren) return;

    var children = treeList.dataSource.childNodes(data);    

    for (var index = 0; index < children.length; index++) {
      var child = children[index];
      if (jQuery.inArray(child.uid, selected_uids) == -1) {
          selected_uids.push(child.uid);
          treeList.select($("tr[data-uid='" + child.uid + "']"));
        selectChildren(treeList,child);
      }
    }
  }  

  function deselectChildren(treeList, uid) {
    var data = treeList.dataSource.getByUid(uid);
    if (!(data && data.hasChildren)) return;

    var children = treeList.dataSource.childNodes(data);

    for (var index = 0; index < children.length; index++) {
      var child = children[index];
            var row = $("tr[data-uid='" + child.uid + "'].k-state-selected");      
      if (row.length == 1) {
          var at = selected_uids.indexOf(child.uid);
        if (at >= 0) selected_uids[at] = null;
        row.removeClass('k-state-selected');
      }
      deselectChildren(treeList,child.uid);
    }
  }

  $("#treeList").data("kendoTreeList").select($("#treeList tbody>tr:nth(0)"));
</script>

</body>
</html>
...