如何刷新jstree而不再触发select_)节点

时间:2012-06-21 13:39:49

标签: jquery jstree

我正在使用jstree插件,带有ajax调用。在某些时候,我打电话给

$("#tree").jstree("refresh");

以检索通过ajax调用创建的新节点。这很有效,只有select_node.jstree在刷新时被触发。有没有办法阻止在树刷新时触发select_node?

5 个答案:

答案 0 :(得分:6)

我最终在刷新之前使用设置标志为true,并且在select_node事件触发器中,仅在标志设置为false时执行逻辑,否则将其设置为false并且不执行任何其他操作:

refresh = true;
$("#tree").jstree("refresh");

[...]

$("#tree").jstree({...}).bind("select_node.jstree", function (e, data) {
    if (refresh) {
        refresh = false;
    } else {
       // do my thing
    }
 });

答案 1 :(得分:2)

或者您可以在刷新后取消选择所有节点

refresh=true;
$("#tree").jstree("refresh");
$("#tree").jstree("deselect_all");

这应该有效!

答案 2 :(得分:2)

bool的问题是如果当前选择的节点有子节点,将为每个子节点触发select_node.jstree。

相反,刷新函数中有two parameters。第二个可以是bool或函数,它接收具有core.selected数组的状态对象,该数组包含所有可见节点。如果清空数组并返回状态,则根本不会触发select_node.jstree。

        var tree = $('#mytree').jstree(true); 

        tree.refresh(false, function (state) {
            //console.dir(state);
            state.core.selected = [];
            return state;
        });

答案 3 :(得分:1)

如果您正在使用UI插件,则刷新()函数"允许在刷新之前保存选择状态并在之后恢复它#34;。因此,如果当前所选节点(刷新之前)是要刷新的节点的子节点,则在刷新之后将通过触发reselect()函数来恢复其状态。刷新功能锁定如下:

refresh : function (obj) {
            var _this = this;
            this.save_opened();
            if(!obj) { obj = -1; }
            obj = this._get_node(obj);
            if(!obj) { obj = -1; }
            if(obj !== -1) { obj.children("UL").remove(); }
            else { this.get_container_ul().empty(); }
            this.load_node(obj, function () { 
                _this.__callback({ "obj" : obj}); 
                _this.reload_nodes(); //this will trigger the reselect() function
            });

我有同样的问题,我评论了那一行(_this.reload_nodes())。不要认为这是一个最佳解决方案,但解决了我的问题。

答案 4 :(得分:1)

在刷新树之前取消选择节点会起作用。