2017-06-29 56 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