Jstree增加刷新回调方法
2016-09-07 15:39
197 查看
这是最近遇到的问题,在使用jstree创建节点后,需要刷新树状数据并选中创建的结点。翻阅了jstree的api,发现他的refresh方法中并没有回调这个概念。这种情况下就只有和后端开发接口的人员协商解决了。
方案1:在加载数据的接口中返回最新创建的结点ID,但显然比较难做到
方案2:创建结点后刷新数据,并返回创建结点的id,由前端人员设置选中它。
方案3:不刷新数据,在已知位置用后端返回的结点数据前前端创建一个新结点。并选中它。
感觉这三种方案都能达到目的,第一种方案前端几乎不用改动,全靠后端接口判断。第二种方案在jstree中新增加一个刷新后附带回调方法,这种方案修改了jstree,其实我也觉得不是很好,主要还是由于我的回调掌握的不是很好,练习练习 囧
首先修改jstree文件,这里我使用的jstree版本为:jsTree 3.2.1
接下来就是创建后刷新回调的方法了:
说明一下,我们的数据统一都是用ajax读取获得的,所以这段代码其实是写在success当中的:
方案1:在加载数据的接口中返回最新创建的结点ID,但显然比较难做到
方案2:创建结点后刷新数据,并返回创建结点的id,由前端人员设置选中它。
方案3:不刷新数据,在已知位置用后端返回的结点数据前前端创建一个新结点。并选中它。
感觉这三种方案都能达到目的,第一种方案前端几乎不用改动,全靠后端接口判断。第二种方案在jstree中新增加一个刷新后附带回调方法,这种方案修改了jstree,其实我也觉得不是很好,主要还是由于我的回调掌握的不是很好,练习练习 囧
首先修改jstree文件,这里我使用的jstree版本为:jsTree 3.2.1
/** * 首先找到以下代码 * refresh : function (skip_loading, forget_state) * 我采取的方法是复制这段代码,新增加一个refresh_clb方法 * refresh_clb: function (cbk,skip_loading,forget_state) * 看参数就能够知道,只是在前面加了一个cbk参数,阅读刷新方法,可以发现它在获取数据后做了一个load方法,我在load的最后加了一句 * cbk && cbk(); */ refresh_clb: function (cbk,skip_loading,forget_state){ this._data.core.state = forget_state === true ? {} : this.get_state(); if(forget_state && $.isFunction(forget_state)) { this._data.core.state = forget_state.call(this, this._data.core.state); } this._cnt = 0; this._model.data = {}; this._model.data[$.jstree.root] = { id : $.jstree.root, parent : null, parents : [], children : [], children_d : [], state : { loaded : false } }; this._data.core.selected = []; this._data.core.last_clicked = null; this._data.core.focused = null; var c = this.get_container_ul()[0].className; if(!skip_loading) { this.element.html("<"+"ul class='"+c+"' role='group'><"+"li class='jstree-i 4000 nitial-node jstree-loading jstree-leaf jstree-last' role='treeitem' id='j"+this._id+"_loading'><i class='jstree-icon jstree-ocl'></i><"+"a class='jstree-anchor' href='#'><i class='jstree-icon jstree-themeicon-hidden'></i>" + this.get_string("Loading ...") + "</a></li></ul>"); this.element.attr('aria-activedescendant','j'+this._id+'_loading'); } this.load_node($.jstree.root, function (o, s) { if(s) { this.get_container_ul()[0].className = c; if(this._firstChild(this.get_container_ul()[0])) { this.element.attr('aria-activedescendant',this._firstChild(this.get_container_ul()[0]).id); } this.set_state($.extend(true, {}, this._data.core.state), function () { /** * triggered when a `refresh` call completes * @event * @name refresh.jstree */ this.trigger('refresh'); }); cbk && cbk(); } this._data.core.state = null; }); }
接下来就是创建后刷新回调的方法了:
说明一下,我们的数据统一都是用ajax读取获得的,所以这段代码其实是写在success当中的:
success: function (data, textStatus, xhr) { if (data.Flag == true) { cleanFrom("add"); var ref = $('#companyTree').jstree(true); var _data=data; let cbkFun=function(){ var node=ref.get_node(_data.Id); ref.deselect_all(); ref.select_node(node); } ref.refresh_clb(cbkFun); messager(data.Message); } }
相关文章推荐
- jstree onselect回调方法,获取选中节点的值
- 实现网页中增加刷新按钮、链接的方法 搜集
- GetCallbackEventReference方法实现局部刷新,回调非WebSerice实现
- 实现网页中增加刷新按钮、链接的方法
- 在学习过程中总结的LoaderManager的LoaderCallbacks刷新数据以使onLoadFinished回调方法能被执行的两种方式
- iOS tableView的增加,删除,刷新,更新的方法
- ajax请求成功后执行回调方法后页面会自动刷新问题
- GetCallbackEventReference方法实现局部刷新,回调非WebSerice实现
- 接口回调方法刷新自定义布局
- collectionView刷新结束状态获取回调方法
- APP页面增加下拉刷新方法
- 添加分页和下拉刷新方法时需要增加的frameworks
- fork 自 AndroidImageSlider,用 fresco 改写,并增加动态刷新轮播图数据的方法
- GetCallbackEventReference方法实现局部刷新,回调非WebSerice实现
- 在struts2下不刷新上传excel文件,并回调页面方法!
- Discuz!帖子刷新后阅读数增加随机值的方法
- 在学习过程中总结的LoaderManager的LoaderCallbacks刷新数据以使onLoadFinished回调方法能被执行的两种方式
- 11种刷新按钮的方法
- 一棵JavaScript写的树- My FlyBean V1.00,支持动态的增加,删除,剪切,插入,克隆,复选框,回调等功能
- 解决在C#程序中动态增加/更新自定义纸型的方法