2011-11-04 53 views
4

這裏Ext.JS防止代理是我的模型:從發送額外的字段

Ext.define('A.model.Group', { 
    extend: 'Ext.data.Model', 
    fields:['id', 'name'], 
    proxy: { 
     type: 'rest', 
     url: '/group', 
     reader: { 
      type: 'json', 
      root: 'data' 
     }, 
     writer: { 
      type: 'json', 
      writeAllFields: false 
     } 
    } 
}); 

該模型在樹上通過TreeStore

問題正在使用的,當一個PUTPOSTDELETE方法完成,而不是隻發送來自JSON有效載荷中模型的字段,還會發送來自Ext.data.NodeInterface的字段。下面是一個例子有效載荷:

{"id":"","name":"TestGroup","parentId":"8","index":0,"depth":3,"checked":null} 

我不想額外字段parentIdindexdepth,並且checked發送。做這個的最好方式是什麼?我不想在服務器上忽略它們。

回答

5

如果你不想發送特定的數據到服務器,writeAllFields不是解決方案,因爲如果設置爲false它只發送修改的字段。 你的問題的解決方案是定義自己的作家和覆蓋方法getRecordData這裏是更多鈔票例如:

var newWriter = Ext.create('Ext.data.writer.Json',{ 
    getRecordData: function(record){ 
     return {'id':record.data.id,'name':record.data.name}; 
    } 
}) 

Ext.define('A.model.Group', { 
    extend: 'Ext.data.Model', 
    fields:['id', 'name'], 
    proxy: { 
     type: 'rest', 
     url: '/group', 
     reader: { 
      type: 'json', 
      root: 'data' 
     }, 
     writer: newWriter 
    } 
}); 
3

NodeInterface增加這些領域的進入你的模型:

{name: 'parentId', type: idType, defaultValue: null}, 
{name: 'index',  type: 'int',  defaultValue: null, persist: false}, 
{name: 'depth',  type: 'int',  defaultValue: 0, persist: false}, 
{name: 'expanded', type: 'bool', defaultValue: false, persist: false}, 
{name: 'expandable', type: 'bool', defaultValue: true, persist: false}, 
{name: 'checked', type: 'auto', defaultValue: null, persist: false}, 
{name: 'leaf',  type: 'bool', defaultValue: false}, 
{name: 'cls',  type: 'string', defaultValue: null, persist: false}, 
{name: 'iconCls', type: 'string', defaultValue: null, persist: false}, 
{name: 'icon',  type: 'string', defaultValue: null, persist: false}, 
{name: 'root',  type: 'boolean', defaultValue: false, persist: false}, 
{name: 'isLast',  type: 'boolean', defaultValue: false, persist: false}, 
{name: 'isFirst', type: 'boolean', defaultValue: false, persist: false}, 
{name: 'allowDrop', type: 'boolean', defaultValue: true, persist: false}, 
{name: 'allowDrag', type: 'boolean', defaultValue: true, persist: false}, 
{name: 'loaded',  type: 'boolean', defaultValue: false, persist: false}, 
{name: 'loading', type: 'boolean', defaultValue: false, persist: false}, 
{name: 'href',  type: 'string', defaultValue: null, persist: false}, 
{name: 'hrefTarget', type: 'string', defaultValue: null, persist: false}, 
{name: 'qtip',  type: 'string', defaultValue: null, persist: false}, 
{name: 'qtitle',  type: 'string', defaultValue: null, persist: false}, 
{name: 'children', type: 'auto', defaultValue: null, persist: false} 

他們兩個不要有堅持'財產。

NodeInterface的大部分字段默認爲persist:false。這意味着默認情況下它們是非持久性字段。調用TreeStore的同步方法或在模型上調用save()時,非持久字段不會通過代理保存。在大多數情況下,大多數這些字段可以保留默認的持久性設置,但有些情況下需要重寫某些字段的持久性。以下示例演示如何覆蓋NodeInterface字段的持久性。重寫NodeInterface字段時,僅更改persist屬性很重要。名稱,類型和defaultValue不應該改變。
覆蓋這樣的字段:

{ name: 'iconCls', type: 'string', defaultValue: null, persist: true }, 
+0

這是最優雅的解決方案,因爲它只使用配置並且不需要覆蓋低級別函數。 –

2

您可以將串行添加到你不想發送到服務器模型的字段。

var makeUndefined = function(value, record) { 
    return undefined; 
} 

var fieldsOfYourModel = [ 
    { 
     serialize: makeUndefined, 
     name: 'parentId' 
    }, 
    { 
     serialize: makeUndefined, 
     name: 'index' 
    } 
]; 

serialize是該Field轉換模型的值轉換成其可通過任何書寫器被用於數據與服務器同步中使用的形式的函數。 http://docs.sencha.com/extjs/4.2.1/#!/api/Ext.data.Field-cfg-serialize

serialize自Ext JS 4.1.1開始提供。

+1

優秀的解決方案!你暗示了這一點,但沒有明確地說出它(這對我來說並不直觀):如果serialize方法返回undefined,那麼該字段將完全排除在服務器之外(它不會提交「未定義」或類似內容) –