2014-05-22 2 views
0

검색 창을 트리 패널에 고정 시켰습니다. 뭔가를 쓰고 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 
          }); 
         } 
        }); 
       } 
      } 
     } 
    } 
+0

expand() 함수 자체에 콜백 함수가 있다는 것을 알았습니다. 나는 그것을 이용하기위한 올바른 방법을 찾고있다. 어떤 아이디어? – Konstantine

답변

0

종종 때 ... 일반적으로 AJAX와 당신이 요청이 처리 된 후에 실행하려는 모든 것을 콜백 함수를 사용해야하지만,이 경우이 작업을 수행하는 방법을 정말 잘 모르겠어요 것을 알고있다 내 Ext 응용 프로그램을 작성하면, 순서대로 실행해야한다고하더라도 AJAX 호출 바로 다음에 호출하는 것이 때때로 너무 빨라 보이는 경우가 있습니다. 어쩌면 트리 노드가 제대로 렌더링되지 않았거나 다른 문제가있는 것일 수 있습니다. 그 코드 주위에 지연 작업을 포장

시도 :

new Ext.util.DelayedTask(function() 
{ 
    response = Ext.decode(response.responseText); 
    var panel = txtField.up(); 
    response.IDs.forEach(function(entry){ 
     panel.getStore().getNodeById(entry.folderId).expand(); <-problem here 
    }); 
}, this).delay(100); 

당신은 비록 그 범위 문제를 해결해야합니다. 지연 기능 직전의 "this"가 범위입니다.

+0

문제가 해결되지 않습니다. setTimer 메서드를 시도했지만 필요한 것은 아닙니다. setTimer는 내부에서 함수를 실행하기 전에 X 시간을 기다리지 만 프로그램 자체는 대기하지 않습니다. 내가 원하는 것은 프로그램이 앞으로 나아 가기를 멈추고 AJAX 응답이 계속해서 폴더 트리 데이터를로드 할 때까지 기다리는 것입니다. setTimer는 프로그램이 계속 실행되는 것을 멈추지 않고 X 초 후에 함수를 시작합니다. 폴더 데이터가 아직로드되지 않은 경우 아무데도 갈 수 없기 때문에이 작업이 도움이되지 않습니다. – Konstantine

관련 문제