2017-06-29 44 views
0

我有动态列的网格:ExtJS的4.2自动同步动态网格店

模型

Ext.define('App.mdlCriteriosConcurso', { 
    extend: 'Ext.data.Model', 
    fields: [ 
    ] 
}); 

STORE

Ext.define('App.strCriteriosConcurso', { 
    extend: 'Ext.data.Store', 
    model: 'App.mdlCriteriosConcurso', 
    autoLoad: false, 
    proxy: { 
     type: 'ajax', 
     api: { 
      read: 'some url', 
      update: 'some url', 
     }, 
     reader: { 
       type: 'json', 
       root: 'data', 
       totalProperty: 'total' 
     }, 
     writer: { 
      root: 'records', 
      encode: true, 
      writeAllFields: true 
     } 
    } 
}); 

GRID

var almacenCriteriosConcurso = Ext.create('App.strCriteriosConcurso'); 
//Some code ... 
{ 
    xtype:'grid', 
    itemId:'gridCriteriosConcursoV4', 
    store:almacenCriteriosConcurso, 
    plugins: [Ext.create('Ext.grid.plugin.CellEditing', {clicksToEdit: 2})], 
    columns:[] 
} 
//Some code... 

CONTROLLER

在这里,在控制器I具有下一段代码:

Ext.ComponentQuery.query('viewFichaDetalle #tabpanelsecundario4_1 #gridCriteriosConcursoV4')[0].getStore().addListener('metachange',function(store,meta){ 
     var columnas=0; 
     var renderer1 = function(v,params,data){ 
      if(v==''){ 
       return '<div style="background-color:#F5FAC3;color:blue;">'+Ext.util.Format.number(0,'0.000,00/i')+'</div>'; 
      } 
      else{ 
       return '<div style="background-color:#F5FAC3;color:blue;">'+Ext.util.Format.number(v,'0.000,00/i')+'</div>'; 
      } 
     }; 
     var renderer2 = function(v,params,data){ 
      if(v=='' || v==0){ 
       return '<div style="background-color:#F5FAC3;color:green;">'+Ext.util.Format.number(0,'0.000,00/i')+'</div>'; 
       //return ''; 
      } 
      else{ 
       return '<div style="background-color:#F5FAC3;color:green;">'+Ext.util.Format.number(v,'0.000,00/i')+'</div>'; 
      } 
     }; 

     Ext.each(meta.columns,function(col){ 
      if(columnas==2){ 
       meta.columns[columnas].renderer = renderer1; 
      } 
      if(columnas>=3){ 
       meta.columns[columnas].renderer = renderer2; 
      } 
      columnas++; 
     },this); 
     Ext.suspendLayouts(); 
     Ext.ComponentQuery.query('viewFichaDetalle #tabpanelsecundario4_1 #gridCriteriosConcursoV4')[0].reconfigure(store, meta.columns); 
     Ext.ComponentQuery.query('viewFichaDetalle #tabpanelsecundario4_1 #gridCriteriosConcursoV4')[0].setTitle("<span style='color:red;font-weight:bold;font-size: 12pt'>Criterios del Concurso con ID:</span> "+"<span style='color:black;font-weight:bold;font-size: 12pt'>"+this.IdConcurso+"</span>"); 
     Ext.resumeLayouts(true); 
    },this); 

我在PHP创建的列,使用元数据。

使用此代码,我将一些渲染器添加到网格列。我看到所有的数据都是完美的,并且可以编辑数据。

在PHPÿ产生这样的列和字段:

$array_metadata['columns'][]=array("header"=>"<span style='color:blue;'>Resultado</span>","dataIndex"=>"puntos_resultado","width"=>82,"align"=>"right","editor"=>"textfield"); 
$array_metadata['fields'][]=array("name"=>"puntos_resultado","type"=>"float"); 

再经过$ array_metadata为“元数据”的响应。

但是,当我尝试同步或自动同步的商店,我得到这个错误:

Uncaught TypeError: Cannot read property 'name' of undefined 
    at constructor.getRecordData (ext-all-dev.js:62247) 
    at constructor.write (ext-all-dev.js:62192) 
    at constructor.doRequest (ext-all-dev.js:102306) 
    at constructor.update (ext-all-dev.js:101753) 
    at constructor.runOperation (ext-all-dev.js:106842) 
    at constructor.start (ext-all-dev.js:106769) 
    at constructor.batch (ext-all-dev.js:62869) 
    at constructor.sync (ext-all-dev.js:64066) 
    at constructor.afterEdit (ext-all-dev.js:64162) 
    at constructor.callStore (ext-all-dev.js:101428) 

更新1

我有源泉这个线程在煎茶论坛link,我已经尝试了所有posibles解决方案和我得到总是相同的错误。

回答

0

该错误告诉我们您没有正确填充模型的fields阵列,因为那是name是必需的配置。在ExtJS 4中,您必须将所有字段添加到模型中才能使同步正常工作。

确切的说,模型样机已充满了正确的字段创建实例之前。

这意味着,你将不得不重写读者的getResponseData的方法,因为Ext.decodereadRecords之间你将不得不设置为从服务器返回的字段准备模型的原型;是这样的:

App.mdlCriteriosConcurso.prototype.fields = data.fields; 
+0

我会尝试这种解决方案 – SensacionRC