日期:2014-05-16  浏览次数:20671 次

Ext tree 优化问题
每次加载树都要从数据库中读取数据,频繁去读取数据库,必然影响效率和性能,现在问题来了,我想第一次加载树从数据库中读取,以后进行的操作只做内存中读取,不在访问数据库,比如添加节点或者删除节点立刻在treePanel中显示,主要就是通过以上对节点的修改不会和数据库交互,在页面上加载被修改过的数据,这里用到的是那个方法,找了半天了都没找到!


------解决方案--------------------
CSS code
可以一次加载,但是前提是一次性将所有数据查询出来然后返回到前台
首次加载后可以将rootVisible: false这样首次就自动加载数据,不用点击根节点才加载
修改页面数据即修改TreeNode即可,可以参考Ext.tree.TreeNode中的方法
增加是appendChild方法、修改内容是setText、删除是remove();

------解决方案--------------------
探讨
每次加载树都要从数据库中读取数据,频繁去读取数据库,必然影响效率和性能,现在问题来了,我想第一次加载树从数据库中读取,以后进行的操作只做内存中读取,不在访问数据库,比如添加节点或者删除节点立刻在treePanel中显示,主要就是通过以上对节点的修改不会和数据库交互,在页面上加载被修改过的数据,这里用到的是那个方法,找了半天了都没找到!

------解决方案--------------------
探讨

不是,你没明白意思,appendChild、remove这些方法就是不和后台数据库打交道的,就是appendChild添加一条数据不会直接添加到数据库的是在内存中寄存的,然后添加的这个节点就直接在treepanel中显示出来了,就是想知道它内部调用的什么方法就把tree显示出来了,看里面的源码,就一句node.render()起了一下作用,其他方法没看到,比如reload()的方法,就是加载树的……

------解决方案--------------------
第一次请求让后台返回整个树信息
如果一个节点有子节点的话让他带上 children 属性, 例子可以看 API 里的TreeLoader

------解决方案--------------------
你看代码不够仔细哈。
你光看了tree.js里面的node没有用啊。
实际上在画树节点的都是TreeNodeUI。

而且你理解上有错误哈,你调用appendChild()的时候,你看到节点画上去了,或者节点被删掉了,并不能表示整个树就刷新了啊?
你只要看看TreeNode.js的:

appendChild : function(n){
if(!n.render && !Ext.isArray(n)){
n = this.getLoader().createNode(n);
}
var node = Ext.tree.TreeNode.superclass.appendChild.call(this, n);
if(node && this.childrenRendered){
node.render();
}
this.ui.updateExpandIcon();
return node;
},
看到了么?并没有刷新树哈。只是让新加入的节点画出来,然后更新自己。

你试试tree.root.ui.updateExpandIcon()呢?我没有试过,抛砖引玉。。。