日期:2014-05-16  浏览次数:20704 次

EXT在renderer里面向后台请求数据的问题
要做一个销售记录的grid,有一列是售货员
用个store远程读取数据库表,表里面的售货员字段是外键,引用员工表的员工编号。
但在前台显示grid的数据的时候,给用户看的当然是售货员的名字而非编号。所以在建grid.ColumnModel的时候对售货员这一列进行处理:
header : '售货员',
dataIndex : 'sales',
renderer : renderer_sale

之后想通过renderer_sale这个函数里面向后台请求数据,传进去编号获取售货员的名字
JScript code
var renderer_sale = function(value) {

    Ext.Ajax.request({
        url : "emp/findNameByCode.action",
        params : {
            "empCode" : value
        },
        method : 'POST',
        success : function(response) {
            var respText = Ext.decode(response.responseText);
            if (respText.success ==true) {
                return respText.name;
                
            } else {
                Ext.example.msg("警告", "失败鸟",
                        "msg-box-error");
            }
        },
        failure : function() {
            Ext.example.msg("警告", "ajax请求失败",
            "msg-box-error");
        } 
    });
};


问题来了:经调试,respText.success ==true值确实为true,对respText.name进行alert的话也可以弹出售货员的名字,但grid那一列总是空白。调试时发现,由于Ext.Ajax.request是异步请求,renderer函数跑完了,而request的数据尚未返回,此时grid已经显示。

请问有什么方法可以等待request返回值之后再结束renderer函数?
或者有其他的办法可以实现我的需求?
各位大神求解救,非常感谢

------解决方案--------------------
首先我认为你的这个解决问题的方向似乎不妥,如果每个 renderer 都发送一个 ajax 请求的话,那得增加多少无谓的网络负载呀?

正确的做法应该是在“store远程读取数据库表”,服务端就通过关联查询把“售货员的名字”一并包含在返回的结果里。

不过,就事论事的话,如果你真要用 ajax 来获取 renderer 的内容,可以在 ajax 的 callback 里面再更新 cell 的内容。


————————————————————————————————
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
------解决方案--------------------
lz 把ajax方法调成同步的试试看。我觉得是在你grid渲染的同时,去异步请求数据。这样会导致grid渲染完了,但数据还没有回来。试试同步吧。async : false