2017-07-18 84 views
0

所以我有這樣的情況:異步數據檢索和ExtJS的渲染與阿賈克斯

renderer: function(value, grid, record) { 
        var testAjax = function(callback) { 
        Ext.Ajax.request({ 
         url: appConfig.baseUrl + '/api/users/' + record.getData().id + '/jobRoles', 
         method: 'GET', 
         success: function(result) { 
         callback(result) 
         }; 
        }); 
        }; 
        return testAjax(function(result) { 
        try { 
         result = JSON.parse(result.responseText); 
        } catch(e) { 
         return ''; 
        } 
        result = result.data; 
        var roles = _.map(result, function(jRole) { 
         console.log(jRole); 
         return jRole.name; 
        }).join(','); 
        console.log("Roles: ", roles); 
        return roles; 
        }); 
       } 

我想實現的是,當我必須呈現特定的領域,我打電話給我的環回終點是什麼,檢索關於關係的一些數據,使用「,」字符映射它,並返回連接的字符串以查看它。

但是,我認爲我在這裏有一些回調問題,因爲我根本沒有看到結果,就好像該函數在調用回調之前返回一樣(因此沒有顯示任何內容,而是顯示從服務器檢索到的內容)。

我試着看看這裏和那裏,這是我想出的最好的。

如何返回父函數的「角色」變量?我如何正確設置我的回調?

問候

+0

將商店中的所有工作角色加載然後查找它們會不會更好? – scebotari66

回答

1

你不能和不應使用與負載的操作和asynchonous回調渲染。如果您過濾或排序或者只是刷新網格視圖,則可以爲相同的記錄調用渲染器幾十次。你想要做的是在一次通話中獲得在網格中顯示所需的所有信息。您不能在單次調用中獲得的數據不應顯示在網格中。您不希望爲1000條記錄調用端點1000次,因爲即使每個呼叫只需要60毫秒,這也是一整分鐘。

也就是說,如果你真的要,因爲你不能改變的端點和角色都被顯示出來,你可以做如下:

dataIndex: 'MyTempRoles', 
renderer: function(value, grid, record) { 
    if(value) return value; // show the loaded value if available 
    else { // no value loaded -> load value 
     Ext.Ajax.request({ 
      url: appConfig.baseUrl + '/api/users/' + record.getData().id + '/jobRoles', 
      method: 'GET', 
      success: function(result) { 
       try { 
        result = JSON.parse(result.responseText); 
        result = result.data; 
        var roles = _.map(result, function(jRole) { 
         console.log(jRole); 
         return jRole.name; 
        }).join(','); 
        record.set("MyTempRoles", roles || " "); // put the loaded value into the record. This will cause a grid row refresh, thus a call to the renderer again. 
       } catch(e) { 
       } 
      } 
     }); 
    } 
} 

這將調用後端在第一次調用渲染器,並異步填充顯示的記錄的臨時變量。當temp變量被填充後,渲染器將自動顯示temp變量的值。

+0

這就像一個魅力! 另外感謝教訓我關於渲染器事件,我認爲它被稱爲一次展出,將更多地看它:) –

+0

打開https://fiddle.sencha.com/#view/editor&fiddle/23nu,打開瀏覽器控制檯,只是向下滾動網格。你會發現渲染器經常被調用。 – Alexander