Extjs 在渲染器网格单元中存储不加载

Extjs 在渲染器网格单元中存储不加载,extjs,grid,store,renderer,Extjs,Grid,Store,Renderer,我试图在我的列中呈现一个字符串,而不是您的id。我创建了这个解决方案:,但它不适用于动态存储 在我的网格中,我将存储加载到渲染器中: columns: [ {xtype : 'gridcolumn', text: 'Id', dataIndex: 'id'}, {xtype : 'gridcolumn', text: 'Validade', dataIndex: 'dataValidade', renderer: funct

我试图在我的列中呈现一个字符串,而不是您的id。我创建了这个解决方案:,但它不适用于动态存储

在我的网格中,我将存储加载到渲染器中:

columns: [
                  {xtype : 'gridcolumn', text: 'Id', dataIndex: 'id'},
                  {xtype : 'gridcolumn', text: 'Validade', dataIndex: 'dataValidade', renderer: function(object){return Ext.Date.format(object, 'd-m-Y');}},
                  {xtype : 'gridcolumn', text: 'Complexo', dataIndex: 'id', renderer: function(value) {
                        storeComplexoPorValidade.getProxy().url = caminhoContexto + "validade/complexoporid/" + value + "/dados.json";
                        storeComplexoPorValidade.load();
                        console.log(storeComplexoPorValidade);
                        var idx = storeComplexoPorValidade.find('id', value);
                        var rec = storeComplexoPorValidade.getAt(idx);
                        return rec.get('descricao');  
                        }
                  },
但是存储不会将数据加载到var,尽管它会执行请求。我发现了一个错误:无法调用undefined的方法'get'


怎么了?

由于存储加载是异步的,所以在接收、处理代理请求的响应之前,渲染器的“返回”将完成,甚至可以分配给您尝试设置的变量

我建议你在这里重新考虑你的方法。有两种选择:

  • 在创建网格之前加载您尝试用于自定义渲染的存储
  • 使用执行自定义渲染所需的额外字段展开网格存储的基础数据模型。您可以始终将这些额外字段标记为非持久性字段,以便它们不会包含在可能对模型实例执行的任何写入操作中

  • 谢谢你的帮助,我还有很多工作要做。根据您的提示,我还发现了另外两种解决方案,它们可以帮助我使代码正常工作。及

    这是我的代码工作:

    Ext.define('validade', {
    extend: 'Ext.data.Model',
    fields: [{name: 'id', type: 'int'},
             {name: 'dataValidade', type: 'date', dateFormat:'Y-m-d'},
             {name: 'complexo', type: 'string', persist: 'false' }]         
    
    }))

    Ext.define('ValidadeStore'{
    扩展:“Ext.data.Store”,
    型号:“validade”,
    pageSize:itemsPerPage,
    remoteSort:是的,
    分拣机:[{
    属性:“id”,
    方向:“描述”
    }],
    代理:{
    键入:“ajax”,
    url:“/validade/grid/dados.json”,
    读者:{
    键入:“json”,
    root:“数据”
    },
    },
    自动加载:{
    回调:函数(记录、操作、成功){
    变量i=0
    loadComplexo();
    函数loadComplexo(){
    如果(i<记录长度){
    var rec=记录[i];
    i++;
    storeComplexo.getProxy().url=“validade/complexoproid/”+rec.get('id')+”/dados.json”;
    storeComplexo.load({
    回调:函数(记录、操作、成功){
    var rec_u2;=记录[0];
    rec.set('complexo',rec_.get('descripao');
    loadComplexo();
    }
    });
    }
    }
    }
    }
    
    }))


    非常感谢

    我怎样才能在之前加载?我在这里尝试,但还没有成功。我的主体将加载存储到Ext.window.window中的initComponent中,并且不将数据加载到var中。但是,当我在'itemclick'侦听器中调用函数时,它就工作了。因此,在创建窗口之前,您可以运行helper存储的加载操作。在这个商店的回调中,您可以在那里创建窗口,这样您就知道助手商店已经加载并准备就绪。然后,您只需在列渲染器中获取对存储的引用,并在不使用代理加载的情况下查找值。如果帮助器存储包含静态数据(例如,数据库表中的某些查找值没有或很少更改),则您可以在应用启动时始终加载数据。这样,应用程序中的存储数据始终可用,并且不需要在创建窗口之前加载,因为它在启动时就已经存在。ExistDissole,感谢您的帮助。我把我的解决方案放在这里。
    Ext.define('ValidadeStore',{
    extend: 'Ext.data.Store',
    model: 'validade',
    pageSize: itemsPerPage,
    remoteSort: true,
        sorters: [{
            property : 'id',
            direction: 'DESC'
        }],
    proxy: {
        type: 'ajax',
        url : '/validade/grid/dados.json',
        reader : {
            type : 'json',
            root : 'data'
        },
    },
    autoLoad: {
        callback: function(records, operation, success){
            var i = 0
    
            loadComplexo();
    
            function loadComplexo(){
                if (i < records.length) {
                    var rec = records[i];
                    i++;
                    storeComplexo.getProxy().url = "validade/complexoporid/" + rec.get('id') + "/dados.json";
                    storeComplexo.load({
                        callback: function(records, operation, success){
                            var rec_ = records[0];
                            rec.set('complexo',rec_.get('descricao'));
                            loadComplexo();
                        }
                    });
                }
            }
        }
    }