검색 창을 트리 패널에 고정 시켰습니다. 뭔가를 쓰고 Enter 키를 누르면 Ajax 요청이 실행되고 요청한 폴더의 지점까지 트리를 확장하는 데 필요한 폴더 ID가 반환됩니다. ajax.request의 성공 설정 내에서 루프를 사용하여 getNodeById를 통해 각 노드의 확장 기능을 호출합니다. 그러나 첫 번째 확장 이후 ExtJS는 (아직로드되지 않았으므로) 폴더 데이터를 가져 오기 위해 프록시에서 아약스 요청을 발생시킵니다. AJAX는 비동기이기 때문에 루프는 서버 응답보다 빠르며 노드 자체가로드되고 정의되지 않은 오류가 발생하기 전에 노드의 .expand() 함수를 호출하려고합니다. 이 문제를 어떻게 해결해야합니까? 나는AJAX가 ExtJS에서 끝나기 전에 트리 노드를 확장
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() 함수 자체에 콜백 함수가 있다는 것을 알았습니다. 나는 그것을 이용하기위한 올바른 방법을 찾고있다. 어떤 아이디어? – Konstantine