Можно ли пометить поле магазина как только для чтения в ExtJS? - PullRequest
2 голосов
/ 07 января 2011

В ExtJS у меня есть JsonStore, настроенный так:

var store = new Ext.data.JsonStore({
    // basic properties
    restful: true,
    autoSave: true,

    // json writer
    writer: new Ext.data.JsonWriter({
        encode: false,
        writeAllFields: true
    }),

    // field config
    fields: [
        'id',
        'name',
        { name: 'timestamp', type: 'date', dateFormat: 'c' }
    ]
});

Свойство timestamp должно быть установлено сервером, а клиент должен только читать его. Однако, если я пытаюсь добавить или обновить запись, используя JsonStore:

// add a record
var record = new store.recordType({ name: 'New record' });
store.insert(0, record);

// update a record
var record = store.getAt(0);
record.set('name', 'Modified record');

JSON, который отправляется на сервер, выглядит следующим образом:

{
    "id": 5,
    "name": "Modified record",
    "timestamp": "01-06-2001T15:23:14"
}

Я бы хотел, чтобы оно прекратило отправку через свойство timestamp, поскольку оно должно быть доступно только для чтения. Есть ли способ настроить хранилище или запись, чтобы получить такое поведение?

Ответы [ 6 ]

2 голосов
/ 27 февраля 2013

Начиная с Ext4, вы можете использовать

persist: false 

в описании поля модели

1 голос
/ 24 марта 2011
Ext.namespace('Ext.ux');

/**
 * Extension of the JsonWriter that doesn't send fields having the config option
 * write set to false
 * @author Friedrich Röhrs
 * @verison 1.0
 *
 */
Ext.ux.AdvJsonWriter = function (config) {
    Ext.ux.AdvJsonWriter.superclass.constructor.call(this, config);
};
Ext.extend(Ext.ux.AdvJsonWriter, Ext.data.JsonWriter, /** @lends Ext.ux.AdvJsonWriter */{
    toHash: function(rec, options) {
        var map = rec.fields.map,
            data = {},
            raw = (this.writeAllFields === false && rec.phantom === false) ? rec.getChanges() : rec.data,
            m;
        Ext.iterate(raw, function(prop, value){
            if((m = map[prop])){
                if (m.write !== false)
                    data[m.mapping ? m.mapping : m.name] = value;
            }
        });
        // we don't want to write Ext auto-generated id to hash.  Careful not to remove it on Models not having auto-increment pk though.
        // We can tell its not auto-increment if the user defined a DataReader field for it *and* that field's value is non-empty.
        // we could also do a RegExp here for the Ext.data.Record AUTO_ID prefix.
        if (rec.phantom) {
            if (rec.fields.containsKey(this.meta.idProperty) && Ext.isEmpty(rec.data[this.meta.idProperty])) {
                delete data[this.meta.idProperty];
            }
        } else {
            data[this.meta.idProperty] = rec.id;
        }
        return data;
    }
});

тогда

var store = new Ext.data.JsonStore({
    // basic properties
    restful: true,
    autoSave: true,

    // json writer
    writer: new Ext.ux.AdvJsonWriter({
        encode: false,
        writeAllFields: true
    }),

    // field config
    fields: [
        'id',
        'name',
        { name: 'timestamp', type: 'date', dateFormat: 'c', write: false }
    ]
});

поле метки времени никогда не будет отправлено на сервер.

0 голосов
/ 08 января 2011

Должно ли writeAllFields быть true?По умолчанию используется значение false, которое не будет отправлять свойство отметки времени, если вы не обновите его.

В качестве альтернативы вы можете переопределить функцию toHash для JsonWriter.На данный момент он имеет следующий комментарий:

TODO Implement excludes/only configuration with 2nd param

Вы можете добавить свою собственную реализацию этого.

0 голосов
/ 08 января 2011

Вы можете попытаться перехватить вызов писателя и просто удалить отметку времени в это время:

var writer = new Ext.data.JsonWriter({
    encode: false,
    writeAllFields: true
});

Ext.intercept(writer, 'render', function(params, baseParams, data) {
    delete data.timestamp;
});

var store = new Ext.data.JsonStore({
...
writer: writer,
...
0 голосов
/ 07 января 2011

Вы также можете установить значение по умолчанию в любое время в поле отметки времени.Вы настроили свой JsonWriter для продолжения и записи во все поля.Если вы установите значение по умолчанию '' или NULL, вы сможете получить желаемое поведение по вашему желанию.

0 голосов
/ 07 января 2011

Если вы установите {disabled: true} в поле отметки времени, оно не должно быть отправлено на сервер

...