解决zTree异步加载使用isParent出现undefind节点的问题

重点在于 dataFilter

  没错,就是ztree里面的setting.async.dataFilter属性。dataFilter是个函数,官方文档解释是异步加载得到的数据的预处理函数。实际上它的作用是:当异步加载开启时,dataFilter这个函数return的内容会自动追加到触发异步加载的父节点上,如果return的值为null,则追加一个undefind节点上去。如果不配置dataFilter,则默认return null!这就是出现undefind节点的原因!

解决办法

  那么要把undefind节点去掉的话应该怎么办呢?有两种处理方法:

  1. 如果异步请求成功是可以拿到数据的,也就是说父节点中是有内容的,那么return异步请求得到的数据。
  2. 如果父节点中是没有内容的,那么直接在dataFilter中返回一个空字符串就好了:return “”

zTree的异步加载

  工作原因,要使用zTree,并且需要使用异步加载,因为对前端不太熟悉的原因折腾了很久,现在发现其实zTree的异步加载超级简单,简直到了傻瓜式的程度。
  首先,zTree的异步加载设置我认为有三个属性是必填的:第一个:enable,设置是否打开异步加载。第二个:url,异步加载请求的地址。第三个:dataFilter,控制加载!
  dataFilter有三个参数,分别是:

  1. treeId:对应 zTree 的 treeId,便于用户操控。
  2. parentNode:进行异步加载的父节点 JSON 数据对象。
  3. responseData:异步请求的响应数据,而且是处理过的!json格式的!zTree可以直接使用的!假如响应数据中有一个deptList,存放的是子节点列表,那么return responseData.deptList,zTree就会自动把这个列表追加到它们的父节点上,这样就完成了异步加载!就是这么简单。

  我折腾了很久的主要原因其实是我之前一直在关注onAsyncSuccess这个方法,第一眼看到这个方法就感觉异步加载应该要在这里面做,请求成功后调用一些追加节点的方法之类的。然而这个方法的意思是异步加载成功,而不是异步请求成功。也就是说进入这个方法时,异步加载操作是已经完成了的。它和beforeAsync方法性质是一样的,就像切点切面一样,在异步加载前后做一些操作,但是并不控制异步加载本身。

推荐一篇拓展文

zTree异步加载时查询节点。亲测可用。