【问题标题】:jsTree - don't select disabled child nodes with parent?jsTree - 不要选择带有父节点的禁用子节点?
【发布时间】:2017-10-20 01:56:33
【问题描述】:

使用 jsTree 插件,开发人员认为在选择父节点时应该选择禁用的子节点 - 我不同意。为了克服这个问题,我认为我可以通过编程方式取消选择禁用的子节点。我已经这样做了:

  $("#selectionTree").on("select_node.jstree",
    function(evt, data) {
      var currentNode = data.node;
      var children = $("#selectionTree").jstree("get_children_dom", currentNode);
      for (var i = 0; i < children.length; i++) {
        var obj = $.parseJSON($(children[i]).attr('data-jstree'));
        if (obj['disabled'] == true) {
          $(children[i]).jstree("deselect_node", children[i]);
        }
      }
    }

我有两个问题。

  1. 我无法在小提琴中完成这项工作,但它可以在我的环境中工作
  2. 如果父节点折叠,则在选择父节点时选择禁用节点,即我的代码仅在禁用的子节点对用户可见时才有效。

我认为解决方案是 jQuery 而不是 jsTree,所以有什么想法吗?

编辑:我的代码示例现在可以正常工作了:https://jsfiddle.net/Lf55r7qt/3/

【问题讨论】:

    标签: jquery jstree


    【解决方案1】:

    我在 1 深树上测试的解决方案有效。我刚刚添加了这个功能:

    //select parents children except disabled ones
    //test on 1-deep
    $("#selectionTree").on("select_node.jstree", function(evt, data) {
        var currentNode = data.node;
    
        //rember opened state for later
        var openedState = currentNode['state']['opened'];
    
        //need to open node for accruate selection       
        $('#selectionTree').jstree('open_node', currentNode);
    
            //get child nodes
        var children = $(this).jstree("get_children_dom", currentNode);
    
            //this allows selections parent nodes to deselect children (without it, there is no three-state)
        if ($("#" + currentNode['a_attr']['id'] + " > i").hasClass("jstree-undetermined")) {
          for (var i = 0; i < children.length; i++) {
            $(children[i]).jstree("deselect_node", children[i]);
          }
        }
    
            //loop through child nodes and select all except disabled nodes
        for (var i = 0; i < children.length; i++) {
          var obj = $.parseJSON($(children[i]).attr('data-jstree'));
          if (obj['disabled'] == true) {
            $(children[i]).jstree("deselect_node", children[i]);
          }
        }
    
            //return parent to closed state if was already
        if (openedState == false) {
          $(this).jstree('close_node', currentNode);
        }
    
    });
    

    工作小提琴:https://jsfiddle.net/Lf55r7qt/6/

    【讨论】:

      【解决方案2】:

      你可以试试这个(对我有用):

      'checkbox': {
        'cascade_to_disabled': false,
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多