Ext.JS阻止代理发送额外字段

时间:2011-11-04 01:32:12

标签: json extjs tree extjs4

这是我的模特:

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方法完成后,Ext.data.NodeInterface中的字段不会仅从JSON有效内容中的模型中发送字段也发送。这是一个示例有效载荷:

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

我不希望发送额外字段parentIdindexdepthchecked。做这个的最好方式是什么?我不想在服务器上忽略它们。

3 个答案:

答案 0 :(得分: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
    }
});

答案 1 :(得分:4)

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属性非常重要。永远不应更改name,type和defaultValue 覆盖这样的字段:

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

答案 2 :(得分:2)

您可以将序列化程序添加到模型中您不想发送到服务器的字段中。

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

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

serialize是一个函数,它将此Field的Model值转换为一种形式,可供任何Writer用于与服务器同步数据。 http://docs.sencha.com/extjs/4.2.1/#!/api/Ext.data.Field-cfg-serialize

从Ext JS 4.1.1开始,

serialize可用。