【问题标题】:JsTree Checkbox check Based on data-idJsTree Checkbox check 基于data-id
【发布时间】:2018-08-21 07:53:40
【问题描述】:

我想根据 data-id 选中未选中的复选框。 在下拉更改时,我想检查 jstree 中未选中的复选框。 我在下面提供我的控制器和 Ajax 方法。

这是我的 jstree 视图。

这是我的控制器:

 [HttpPost]
    public ActionResult GetSingleUser(int id)
    {
        MachineShopDBEntities DB = new MachineShopDBEntities();
        var SPresult = DB.GetSingleUser(id).FirstOrDefault();
        return Json(SPresult);
    }

这是我的脚本:

   $("#UserSelect").change(function () {
        $.post("/MenuMaster/GetSingleUser?id=" + $(this).val(),
                function (data, status) {
                    var databaseString = data.MenuEnable;
                    for (i = 0; i <= databaseString.length; i++) {
                        if (databaseString.substring(i, i + 1) == "1") {
                            $('.jstree-container-ul li[data-id=' + (i + 1) + ']').find('.jstree-anchor').addClass('jstree-clicked');
                        }
                    }    
                });
    });

【问题讨论】:

  • @Niharika, @Azaz,请告诉我 #UserSelect 是什么,这个复选框 id 是什么? GetSingleUser 方法的作用是什么?
  • 它是下拉 ID,它将根据该字符串返回一个字符串,我将找到该字符串的索引,如果我们找到 1,那么该索引和 jstree 数据 ID 将匹配,那么我们必须检查checkbox这种类型的逻辑是否成功。
  • 表示如果下拉列表中选择的项目与 jsTree 复选框匹配,则将应用 jstree-clicked 类对吗?
  • 是的,但现在只有那个特定的复选框我面临的问题是父母被选中,然后它的孩子将被自动选中。
  • 好的,你能不能给我提供下拉和jsTree的文本格式的示例数据,所以我会尽力为你准备答案

标签: c# jquery ajax asp.net-mvc jstree


【解决方案1】:

我在这里为你创建了演示。

根据下面的代码sn-p进行修改

jQuery(function ($) {
        $('.menux').jstree({

            "core": { "check_callback": false },

            "checkbox": { "keep_selected_style": false, "three_state": false, "tie_selection": false, "whole_node": false, },

            "plugins": ["checkbox"]

        }).bind("ready.jstree", function (event, data) {

            $(this).jstree("open_all");
            
        }).on("check_node.jstree uncheck_node.jstree", function (e, data) {

            var currentNode = data.node;

            var parent_node = $(".menux").jstree().get_node(currentNode).parents;

            if (data.node.state.checked)
                $(".menux").jstree().check_node(parent_node[0]);
            else
                $(".menux").jstree().uncheck_node(parent_node[0]);
        })

    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="http://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.3.1/css/bootstrap.css" rel="stylesheet" />
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.3.5/jstree.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/themes/default/style.min.css" />



<div class="menux">
    <ul>
        <li>
            Root node 1
            <ul>
                <li data-id="1"><a href="#" >Child node 1</a> </li>
                <li data-id="2"><a href="#" >Child node 2</a></li>
                <li data-id="3"><a href="#" >Child node 3</a></li>
                <li data-id="4"><a href="#" >Child node 4</a></li>
                <li data-id="24"><a href="#" >Child node 24</a></li>
            </ul>
        </li>
    </ul>
</div>

编辑:

首先确保在初始化jsTree 时禁用three-state,如上面代码sn-p 中所述。

尝试在您的代码中实现上述$('.menux li').each 函数。 下面的代码只是你必须把这个$('.menux li').each放在哪里的示例。

$("#UserSelect").change(function () {
        $.post("/MenuMaster/GetSingleUser?id=" + $(this).val(),
            function (data, status) {
                var databaseString = data.MenuEnable;

                $('.menux li').each(function (index, value) {

                    var node = $(".menux").jstree().get_node(this.id);

                    var id = node.data.id;

                    for (i = 0; i <= databaseString.length; i++) {

                        if (databaseString.substring(i, i + 1) == "1") {

                            if ((i + 1) == id) {

                                $(".menux").jstree().check_node(this.id);
                            }
                        }
                    }
                });
            });
    });

如果您遇到类似jsTree is not a function 的任何错误,那么您可以用这个替换上面的$('.menux li').each 函数

$('.menux li').each(function (index, value) {

            for (i = 0; i <= databaseString.length; i++) {

                if (databaseString.substring(i, i + 1) == "1") {

                    var dataid = $('#' + this.id).data('id');

                    if ((i + 1) == dataid) {

                        $('#' + this.id).find('.jstree-anchor').addClass('jstree-clicked');
                    }
                }
            }
        });

【讨论】:

  • @Azaz khan,查看答案可能对您有帮助:)
  • 嘿!您的代码如何正确,但树功能我不想停止。我想在下拉选择后执行此操作。你能告诉我是否可能。-@ershoaib
  • 我会尽快更新答案...我会让你知道的
  • @Azaz khan,查看答案中的编辑部分并尝试在您身边实施:)
  • 所以在我的情况下树功能将被禁用。对吗?如果我想自动检查父级,那么在我的情况下是不可能的,对吧? @ershoaib
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-31
  • 2022-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-25
相关资源
最近更新 更多