我正在使用带有 ajax 调用的 jstree 插件。在某个时候,我打电话给
$("#tree").jstree("refresh");
为了检索通过 ajax 调用创建的新节点。这很好用,除了 select_node.jstree 在刷新时被触发。有没有办法防止 select_node 在树刷新时被触发?
我最终在刷新之前使用将标志设置为 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
}
});
或者您可以在刷新后取消选择所有节点
refresh=true;
$("#tree").jstree("refresh");
$("#tree").jstree("deselect_all");
这应该工作!
在刷新树之前取消选择节点会起作用。
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;
});
如果您使用的是 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())。不要认为这是一个最佳解决方案,但解决了我的问题。