3

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

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

为了检索通过 ajax 调用创建的新节点。这很好用,除了 select_node.jstree 在刷新时被触发。有没有办法防止 select_node 在树刷新时被触发?

4

5 回答 5

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
    }
 });
于 2012-06-21T15:04:05.343 回答
2

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

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

这应该工作!

于 2013-06-06T13:53:33.303 回答
2

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

于 2013-06-10T17:37:44.187 回答
2

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

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

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

        tree.refresh(false, function (state) {
            //console.dir(state);
            state.core.selected = [];
            return state;
        });
于 2015-02-11T09:40:51.273 回答
1

如果您使用的是 UI 插件,则 refresh() 函数“启用在刷新之前保存选择状态并在之后恢复它”。因此,如果当前选中的节点(刷新前)是待刷新节点的子节点,刷新后会通过触发 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())。不要认为这是一个最佳解决方案,但解决了我的问题。

于 2013-01-04T14:43:39.440 回答