现在的位置: 首页 > 综合 > 正文

extjs4 动态加载树

2017年10月15日 ⁄ 综合 ⁄ 共 964字 ⁄ 字号 评论关闭

动态加载树与一次性加载所有节点树,在后台数据的区别在于children这个属性的存在与否。动态加载树还需要nodeParam这个属性作为加载后台时的参数。

有个问题很纠结,就是当新建了一个节点时,如果这个节点下面没有子节点,我希望在新建这个节点后就能立刻让它以叶子leaf节点的形式来展现(特征是图标的前面没有加号)。而当这个节点下我又新建了子节点时,它又能转化为非叶子节点。

然而冥思苦想了很久都没能实现。因为我的树结构是这样的。ROOT->项目节点->文件节点。 我新建了一个项目节点时,它必然是没有子节点也就是文件节点的。那么它事实上就是个leaf节点。因此在它的数据库值跟页面值里,都应该是leaf才对,这样它才不会在图标前有一个展开符号。而当我在项目节点下新增了一个文件节点,项目节点就不应该再是leaf=true的节点了。虽然在数据后台完全可以做到这种改变。但是,由于是动态加载的树结构,会导致当项目节点下面的文件节点全被删除后,项目节点本身是不会刷新的,导致它仍然leaf=false;或者当一个leaf=true的项目节点新增了一个子节点,但是项目节点本身不会刷新,导致项目无法展开,看不到新增的子节点。除非刷新整个树,或者刷新项目节点的父节点。然而这么做就失去了动态加载的意义。

那么怎么才能做到动态的改变项目节点的展开与不能展开值的变化呢?

经过一番苦苦查询api,终于找到了一个关键的属性,node类里的expanded属性,决定了节点展开与否。如果为true,它会自动将节点展开。考虑到extjs tree本身,即使一开始某个节点的leaf=false,它有展开符号,如果它下面没有子节点,则在展开后它的展开符号就会消失。

那么解决的方案就是,所有的项目节点,无论它下面是否有子节点,都使它的leaf值为false,也就是可用展开。然而为了让它在子节点为空的时候自动让展开符号消失,我们要做的 就是在第一次加载树的时候,让这些子节点为空的项目节点全部展开一次,这样它就没有展开符号了,而且即使接下来为它新建了文件子节点,它也是能够展开的(因为它本身leaf就是true)。因此当项目节点下子节点是否为0这个状态发生改变时,我们要改变的不是项目节点的leaf值,而是它的expanded值。这个值决定了该节点是否自动展开。

抱歉!评论已关闭.