我正在寻找递归扩展树节点的方法 . 树没有完全装满 . 我们一次只加载一个深度级别 . 因此,例如,如果我的路径有3个级别(/ nodeId1 / nodeId14 / nodeId142)深度我想加载第一个节点,那么通过路径中的第二个ID(在本例中为nodeId14)获取2级节点展开它,然后获得第3等
但是,当一个节点被扩展时,代理会有一个AJAX调用来获取节点子节点的数据,并且由于这个调用是异步的,所以在请求有时间完成之前,程序本身会尝试继续扩展下一级节点 . 给我一个'节点未定义错误',因为级别2还没有加载 .
我一直在寻找如何解决这个问题的一天,但没有任何帮助 . 我发现一个博客解决了同样的问题,但帖子是从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()回调添加函数,我尝试过delayedtask,我尝试过setTimer等,但没有任何作用 . 我真的没有选择,这似乎是一件很简单的事情,但它让我疯狂 .
2 回答
如果您有要扩展的节点的路径,例如从先前对getPath的调用中保存
然后任务是微不足道的:
您可以通过键入console在http://docs.sencha.com/extjs/4.2.2/extjs-build/examples/build/KitchenSink/ext-theme-neptune/#tree-reorder测试此方法:
如果您没有路径但是在扩展(加载)父级之后决定要扩展哪个子级,则任务会更麻烦 . 在这种情况下,您可能会使用
callback
函数进行扩展,并继续扩展回调中的子项 .有关详细信息,请参阅node.expand
这是一个带有大量评论的更新解决方案,以帮助人们了解正在发生的事情: