Ext.JS Запрет прокси от отправки дополнительных полей - PullRequest
4 голосов
/ 04 ноября 2011

Вот моя модель:

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

Проблема в том, что при выполнении метода PUT, POST или DELETE вместо отправки только полей из модели в полезной нагрузке JSON также отправляются поля из Ext.data.NodeInterface. Вот пример полезной нагрузки:

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

Я не хочу, чтобы дополнительные поля parentId, index, depth и checked были отправлены. Каков наилучший способ сделать это? Я не хочу игнорировать их на сервере.

Ответы [ 3 ]

5 голосов
/ 04 ноября 2011

Если вы не хотите отправлять только определенные данные на сервер, 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
    }
});
4 голосов
/ 25 января 2015

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}

двое из них не имеют свойства persist.

Большинство полей NodeInterface по умолчанию сохраняются: false. Это означает, что они являются непостоянными полями по умолчанию. Непостоянные поля не будут сохранены через Прокси при вызове метода синхронизации TreeStore или при вызове save () в Модели. В большинстве случаев большинство этих полей можно оставить с настройками постоянства по умолчанию, но в некоторых случаях необходимо переопределить сохранение некоторых полей. В следующем примере показано, как переопределить постоянство поля NodeInterface. При переопределении поля NodeInterface важно только изменить свойство persist. имя, тип и defaultValue никогда не должны изменяться.
Переопределите поля следующим образом:

 { name: 'iconCls', type: 'string',  defaultValue: null, persist: true },
2 голосов
/ 29 января 2015

Вы можете добавить сериализатор к полям в модели, которую вы не хотите отправлять на сервер.

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

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

serialize - это функция, которая преобразует значение модели для этого поля в формукоторый может использоваться любым устройством записи, используемым для синхронизации данных с сервером.http://docs.sencha.com/extjs/4.2.1/#!/api/Ext.data.Field-cfg-serialize

serialize доступно с версии Ext JS 4.1.1.

...