【发布时间】:2014-05-22 11:10:30
【问题描述】:
我对范围问题进行了一些搜索,发现了一些东西,但我不确定它们是否适合我的情况。我真的很困惑atm所以我想我还是直接去论坛问吧。
我有一个树面板。在该树面板内,我有一个 xtype: 'textfield' 的停靠项。该文本字段接受一个值并将其用作通过特殊键事件处理程序内的 Ext.Ajax.Request 的 ajax 请求中的参数。服务器在其响应中返回一个 JSON 对象,该对象被解码并包含树节点的文件夹 ID。在 ajax 请求的 SUCCESS 配置中,有一个我想运行的函数,它必须通过 getNodeById(IdFromAjaxResponse) 引用树的节点并展开它们。问题是我不知道如何引用这些节点。我试过this.getStore().getNodeById,但结果是'this'指的是窗口(我猜我的树面板容器???)。如何引用树面板或树商店?我不想使用 getCmp 等直接推荐。
一些帮助代码:
Ext.define('treePanel', {
extend: 'Ext.tree.Panel',
alias: 'widget.folderTreePanel',
//title: 'Folder Tree',
displayField: 'name',
rootVisible: false,
store: 'treeStore'
dockedItems: {
xtype: 'textfield',
name: 'Search',
allowBlank: true,
enableKeys: true,
listeners: {
specialkey: function (txtField, e) { //This handler will essentially take the search value and return the path from the DB
if (e.getKey() == e.ENTER){
var searchValue = txtField.getValue();
Ext.Ajax.request({
url: 'MyServlet',
params: {
caseType: 'search',
value: searchValue
},
success: function(response) {
response = Ext.decode(response.responseText);
var node, i=0;
expandFn = function () {
This is where I have a problem->node = this.up('treePanel').getStore().getNodeById(response.IDs[i].folderId);
node.expand();
i++;
if (i >= response.IDs.length-1) return;
expandFn();
}
}
});
}
}, scope: this
}
},
columns: [{
xtype: 'treecolumn',
text: 'Folder Name',
flex: 2,
sortable: true,
dataIndex: 'name'
},{
text: 'Folder ID',
dataIndex: 'id',
flex: 2,
sortable: true
}]
});
编辑:我找到了答案。每个事件将触发它的实例作为参数传递给处理函数。在这种情况下,txtField 指的是文本字段本身。然后我可以遍历继承并找到面板。
但是现在有一个新问题。 expandFn() 被调用一次,然后因为“节点”未定义而停止。它应该递归,直到响应数组中没有更多项目。我再次认为这是一个范围问题,但我真的很困惑,我似乎没有看到出错...
【问题讨论】:
标签: javascript extjs scope extjs4 handler