关于jstree刷新后操作

通过jstree展示一个树形结构的时候,当我针对一个结点的父节点刷新的时候,那么,当前选中的节点的选中状态不存在了,原因在于:刷新后dom的节点信息,是重新生成的了。

开始采用的代码:

// $parentNode  父亲节点
// $currentNode 当前节点,在刷新之前记录此信息
("#jstree").jstree('refresh', $parentNode);
// 通过查询dom元素,每个结点的信息,是通过li下的a添加样式完成
$currentNode.find('a').addClass('jstree-clicked');

如上代码,除了存在元素找不到的情况,还有一个问题:

对于refresh操作,是通过ajax完成对服务器的请求,这个时候,请求发出去后,就继续执行接下来的语句了。

其实,如果我们采用jQuery的ajax操作后,我们发现,其实在请求完毕,习惯有一个callback来继续操作。如此,观察到refresh的操作,在请求前,记录刷新前结点的状态(如,展开状态),请求后,再次还原刷新前状态,如此看来,其实在jstree的refresh中,应该存在一个callback,但是从官方的文档中,没有看到这个参数。

查看源码:(代码527行位置)


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();});
}


正如,上面所猜测的,在执行load_node的时候,执行了一个callback的方法。对上面的代码调整,添加一个参数的callback,并且在加载完成节点信息后,执行此方法。看代码:


refresh : function (obj, cbk) {
	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(); cbk && cbk();});
}

对开始的代码,调整为:

// $parentNode  父亲节点
// $currentNode 当前节点,在刷新之前记录此信息
("#jstree").jstree('refresh', $parentNode, function() {
    // 通过查询dom元素,每个结点的信息,是通过li下的a添加样式完成
    $currentNode.find('a').addClass('jstree-clicked');
});


如上,我们解决了,在服务器请求完毕后,对节点的信息再调整的一个功能。

你可能感兴趣的:(刷新,回调,refresh,jstree)