2013-09-04 6 views
1

다음은 Ext.grid.Panel 열의 렌더러입니다. contactStore에 2,000 개의 값이 있다고 가정하고 id (이 경우 value 매개 변수)를 기반으로하는 레코드의 이름이 마음에 든다면 그리드에만 25 개의 행/레코드가 있습니다. 2,000 개의 레코드를 모두로드하는 대신 그리드 열 ID와 관련된 관련 레코드 (외래 키 기반)를 가져올 수 있도록 저장소를 동적으로 가져올 수 있습니까? 저장소를로드 한 다음 콜백에서 어떻게 든이 "렌더러"함수가 콜백 성공 후 값을 표시하도록 할 수 있습니까?Ext.grid.Panel 열의 표시 페이지 데이터를 기반으로 저장소를 동적으로로드

columns: [{ 

...

}, { 
    header: 'Contact Name', 
    flex: 1, 
    sortable: true, 
    dataIndex: 'contact_id',   
    renderer: function(value) { 
     var contactStore = Ext.StoreManager.lookup('Contacts'); 
     return contactStore.getById(value).get('full_name'); 
    } 
}, { 
+0

나는 당신이 렌더러 또는 테이블 뷰 중 하나를 해킹 할 것이라 생각합니다. 첫 번째 경우에는 연락처 저장소가 페이지 당 25 개의 요청을로드한다는 것을 의미합니다. 그걸 고려해 봤니? 나중에 경우에 연락처 저장소에 25 개의 임의 연락처를 한 번에로드 할 수있는 방법이 있습니까? – rixo

+0

저는 이것을 수행하는 몇 가지 다른 방법에 대해 읽었습니다. (1) 별도의 저장소가 있고 페이지의 데이터를 기반으로 해당 저장소를로드하는 것 (2) 관련 모델을 사용하여 그리드 저장소 (3)의 추가 필드로 이름을로드하고 이름을 가져 오는 것은 관련 매장 (들) ........ 다른 사람들의 사례를 찾을 수는 없지만 .... Rixo는 무엇을 추천하겠습니까? – MacGyver

+1

서버를 제어 할 수 있다면 그리드 모델에 이름 필드를 확실히 추가 할 수 있습니다. 그러면 많은 요청을 줄일 수 있고 코드를 훨씬 간단하게 만들 수 있습니다. 따라서 더 안정적입니다. 대답을위한 – rixo

답변

1

당신은에 대한 viewConfig에서 collectData(records, startIndex)을 조정할 수 있습니다

Ext.create('Ext.grid.Panel', { 
    (...) 
    viewConfig: { 
     //this method needs to be adjusted 
     collectData: function(records, startIndex) { 
      var me = this; 
      //we can use a custom function for this 
      if (me.onBeforeCollectData) { 
       me.onBeforeCollectData(records); 
      }    
      var data = me.superclass.collectData.call(me, records, startIndex); 
      return data; 
     }, 

     onBeforeCollectData: function(records) { 
      var newExtraParams = []; 
      var oldExtraParams; 
      var needToLoadStore = false; 
      var contactStore = Ext.StoreManager.lookup('Contacts');   

      if (contactStore) { 
       oldExtraParams = contactStore.oldExtraParams; 
      } else { 
       //don't use autLoad: true, this will be a local store 
       contactStore = Ext.create('Ext.data.Store', { 
        storeId:'Contacts', 
        (...)     
       }); 
       needToLoadStore = true; 
      } 

      for (var x in records) { 
       //contact_id is read out here 
       var param = records[x].get('contact_id'); 
       if (param) { 
        if (needToLoadStore == false && Ext.Array.contains(oldExtraParams, param) == false) { 
         needToLoadStore = true; 
        } 
        newExtraParams.push(param); 
       }     
      }   

      if (needToLoadStore == true) { 
       //we use this to load the store data => because of async: false property 
       Ext.Ajax.request({ 
        scope: this, 
        //this is for synchronous calls 
        async: false, 
        url: (...), 
        method: (...), 
        params: newExtraParams, 
        success: function (res, opt) { 
         var responseObj = Ext.decode(res.responseText, false); 
         contactStore.loadData(responseObj); //or deeper in the responseObj if needed 
         contactStore.oldExtraParams = newExtraParams; 
        } 
       }); 
      } 
     } 
    } 
});
+1

+1. 나는 이것을하는 약간 다른 방법에 관하여 읽었다. (1) 별도의 저장소가 있고 페이지의 데이터를 기반으로 해당 저장소를로드하는 것 (2) 관련 모델을 사용하여 그리드 저장소 (3)의 추가 필드로 이름을로드하고 이름을 가져 오는 것은 관련 상점 (들) ........ 다른 사람들의 사례를 찾을 수는 없지만 ... Alexander에게 무엇을 권하고 싶습니까? – MacGyver

+1

그런 생각이 들었습니다. 매번 연락처 저장소를 만들지 않고보기에 첨부합니다. 'onBeforeCollectData'에서'extraParams'를 사용하여 상점 로딩을 트리거하는 것을 잊지 마십시오. 마지막으로 컨택 스토어가로드되면 뷰의'refresh' 메소드를 호출하는 콜백이 필요합니다. 재미있는 부분은'collectData'가'refresh'에서 호출된다는 것입니다. 따라서 콜백에서'refresh'가 호출 될 때'onBeforeCollectData'가 호출되지 않도록 테스트를 추가해야합니다. 그렇지 않으면 무한 루프가 발생합니다 . – rixo

+1

@MacGyver (2)를 추천한다. 왜냐하면'return record.get ('contactName');으로'column'에 커스텀'렌더러 '를 주어야하기 때문이다. 그리드 저장소로드 웹 서비스에 대한 더 많은 열 또는 백엔드에 저장하면이 필드를 저장소에 쉽게 추가 할 수 없습니다. –