【问题标题】:Why doesn't jsTree open_all() work for me?为什么 jsTree open_all() 不适合我?
【发布时间】:2010-08-27 15:08:07
【问题描述】:

昨天开始使用 jQuery 和 jsTree 插件,并通过对 servlet 的 AJAX 调用成功地加载了树。现在,我想让树在加载后打开所有节点,所以我在 ajax 属性中添加了一个成功函数。但是,我似乎无法让 open_all() 方法正常工作。我对使用 jQuery 很陌生,所以我猜这很简单,我做错了。

Firebug 没有显示任何错误,这排除了错误输入方法名称的愚蠢错误。我检查了文档,我认为我根据我阅读的内容正确地做所有事情。树正在正确加载,但在页面加载后没有打开所有节点。

我在 Firefox 3.6.8 上使用 jQuery 1.4.2 和 jsTree 1.0rc2。

这是我用来加载树并尝试打开树中所有节点的代码:

// Create the tree object
$("td#modelXML").jstree({
    core : { "animation" : 0 },
    //xml_data : {"data" : "" + xml, "xsl" : "nest"},
    xml_data : {"ajax" : 
                    {"url" : "servlet/GetModelHierarchy", 
                    "type" : "post", "data" : { modelId : "" + modelId} }, 
                    "xsl" : "nest",
                    "success" : function(){
                                $(this).open_all(-1);
                                }
    },
    themes : {"theme" : "classic", "dots" : true, "icons" : true},
    types : { 
        "types" : {
            "category" : {
                "valid_children" : ["factor"]
            },
            "factor" : {
                "valid_children" : ["level"]
            },
            "level" : {
                "valid_children" : "none",
                "icon" : {
                    "image" : "${request.contextPath}/jsTree/file.png"
                }
            }
        }
    },
    plugins : ["themes", "types", "xml_data"]
});

【问题讨论】:

    标签: jquery jstree


    【解决方案1】:

    你必须挂钩事件,然后调用open_all

    要在加载时打开所有节点,请使用:

        var tree = $("#id-or-selector-for-my-tree-element");
        tree.bind("loaded.jstree", function (event, data) {
            tree.jstree("open_all");
        });
    

    在使用.jstree({...}) 初始化树之前,请执行上述操作。

    如果你刷新它,那么要再次打开所有节点,你必须使用:

        tree.bind("refresh.jstree", function (event, data) {
            tree.jstree("open_all");
        });
    

    【讨论】:

      【解决方案2】:

      是的,这是一个老问题,但没有公认的答案,唯一的答案对我没有用,这是我现在使用的答案:

      var tree = $("td#modelXML")
          .bind("loaded.jstree", function (e, data) {
              data.inst.open_all(-1); // -1 opens all nodes in the container
          })
          .jstree({ /* your jsTree options as normal */ });
      

      这里的关键点是 data.inst 是您的 jsTree,并且是您唯一可用的参考,因为在 .jstree({ 完成之前,tree 将没有值。由于在.jstree({ 调用中调用了loaded.jstree,因此结果将不存在。看到了吗?

      【讨论】:

      • 刷新后无论如何要使这项工作?加载的事件似乎没有触发。是否有任何其他事件可以告诉数据何时加载?
      • 对于 jstree v3 你现在需要这个(我只打开了根节点).on('loaded.jstree', function(event, data){ data.instance.open_node('0') })
      【解决方案3】:

      我完全无法让它与 tree.jstree('open_all')data.inst.open_all(-1) 一起工作 - 最后我不得不使用 data.instance.open_all() - 注意从 inst 到 instance 的变化,以及 open_all(-1) 到 open_all () - 这两个似乎都是 jQuery 1.11 和 jstree 3.0.0 所必需的。我的最终代码块如下所示:

      $(document).ready(function() {
          var tree = $('#jstree');
          tree.bind('loaded.jstree', function(event, data) {
              data.instance.open_all();   
          });
          tree.jstree({});
      });
      

      【讨论】:

        【解决方案4】:

        试试这个!

        $("td#modelXML").jstree("open_all","#nodeID");
        

        【讨论】:

          猜你喜欢
          • 2014-01-03
          • 2011-04-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多