2

我现在得到的是:

renderer : function(value) {
    var ret;
    var conn = new Ext.data.Connection();
    conn.request({
        method : 'POST',
        url : rsdBackend,
        params : {
            get_object_by_id : 'true',
            rsd_type : record.data.references_table,
            object_id : value,
            uid : logged_user_id
        },
        success : function(responseObject) {
            var data = Ext.decode(responseObject.responseText);
            ret = data[0].object_name;
        }
    });
    return ret;
}

如果一列包含指向另一个数据的链接(数据库术语中的外键),我需要显示它引用的对象的名称。

所以,我能想到的最好的方法是在渲染器中使用 ajax 调用。它有效,但问题是:我怎样才能返回响应?

上面的代码不起作用,原因ret在我尝试的地方未定义return

如何做到这一点,或者有更好的方法吗?

4

2 回答 2

3

基于这个线程Sencha forum thread

我做了一个异步渲染器。

在我的示例中,我想在我的记录关联中显示第一条记录的“名称”值。

“fileRecord_store()”是我的关联商店的名称(通过“hasMany”关联模型创建)

在网格面板中,您可以制作这样的渲染器:

 { header: 'Filename',  dataIndex: 'Files_id',      flex: 2,
    renderer: function(value, meta, record, rowIndex, colIndex, store, view) {
          var divId = 'my_cell_to_update_' + record.id;
          record.columnsNameUpdate(divId);
          return String.format("<div id='" + divId + "'>Loading...</div>"); 
                }
},

现在在模型类中我添加了这个函数:

columnsNameUpdate : function(divId){

    this.fileRecord_store().on('load', this.updateColumn,this, {divId : divId});
    this.fileRecord_store().load();
},

updateColumn : function(store, model, success, options){
    this.fileRecord_store().un('load', this.updateColumn,this);
    Ext.fly(options.divId).update(store.first().get('filename')); 
}

这对我来说很好!

于 2012-07-20T15:22:42.810 回答
2

我不认为你可以这样做。Ajax 调用是异步的,renderer()函数是同步的。我现在无法想象如何将它们混合在一起。

在渲染网格之前,您需要获取renderer()函数(所有单元格!)完成所需的所有信息。为什么不能为它创建一个额外的商店,先加载它然后使用它?

于 2012-04-26T11:54:11.687 回答