2017-07-18 64 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