【发布时间】:2014-07-12 15:29:42
【问题描述】:
我正在寻找一种递归扩展树节点的方法。树还没有装满。我们一次只加载一个深度级别。因此,例如,如果我的路径有 3 个深度级别(/nodeId1/nodeId14/nodeId142)我想加载第一个节点,然后通过我的路径中的第二个 ID 获取 2 级节点(在本例中为 nodeId14)展开它,然后得到第三个等。
然而,当一个节点被扩展时,代理会调用 AJAX 来获取节点子节点的数据,并且由于该调用是异步的,因此程序本身会在请求完成之前尝试继续扩展下一级节点是时候完成给我一个“节点未定义错误”了,因为级别 2 尚未加载。
我一直在寻找如何解决这个问题的 1 天,但没有任何帮助。我发现一个博客解决了同样的问题,但这篇文章是 2009 年的,他使用的一些东西已被弃用。
http://hamisageek.blogspot.gr/2009/04/extjs-tip-recusively-opening-nodes-in.html
一些帮助的代码:
Ext.define('treeStore',
{
extend : 'Ext.data.TreeStore',
alias: 'widget.treeStore',
autoLoad : false,
model : 'treeModel',
root : {
id: 0,
name : 'Root',
expanded : true,
loaded: true
},
proxy : {
type : 'ajax',
url : 'MyServlet',
reader : {
type : 'json',
root : 'children'
}
},
folderSort: true
});
Ext.define('Ext.tree.Panel',{
.
.
.
//Stuff about the tree panel etc.
dockedItems: {
xtype: 'textfield',
name: 'Search',
allowBlank: true,
enableKeys: true,
listeners: {
specialkey: function (txtField, e) {
if (e.getKey() == e.ENTER){
var searchValue = txtField.getValue();
Ext.Ajax.request({
url: 'MyServlet',
params: {
caseType: 'search',
value: searchValue
},
success: function(response) { //ATTENTION: When calling the .expand() the AJAX hasn't finished and cannot find the node.
response = Ext.decode(response.responseText);
var panel = txtField.up();
response.IDs.forEach(function(entry){
panel.getStore().getNodeById(entry.folderId).expand(); <-problem here
});
}
});
}
}
}
}
我尝试向 expand() 回调添加函数,我尝试过延迟任务,我尝试过 setTimer 等,但没有任何效果。我真的没有选择,这似乎是一件很简单的事情,但它让我发疯。
【问题讨论】:
标签: recursion extjs tree panel