Расширить Ext.данные.Модель (динамически добавлять поля)

я расширил существующую модель, добавляя поля с помощью прототипа. Все работает нормально, данные могут быть получены со стороны сервера и могут быть использованы на стороне клиента. Но, когда я теперь обновляю свои данные и отправляю их обратно на сервер, "новые" поля не распознаются автором прокси-сервера.

чтобы быть более конкретным: у меня есть модель такой:

    Ext.define('Osgaar', {
      extend: 'Ext.data.Model',
      fields: [
        { name: 'first', type: 'string' },
        { name: 'second', type: 'string' },
        { name' 'third', type: 'string' }
      ],

      proxy: {
        type: 'rest',
        url: 'public/svcmethod',
        reader: {
          type: 'json',
          root: 'data'
        },
        writer: {
          type: 'json',
          writeAllFields: false
        }
      }
    });

я расширяю модель так:

    Osgaar.prototype.fields.add({ name: 'fourth', type: 'string' });

Я пытался установить writeAllFields в false и все атрибуты переданы, есть только те из определенной модели, а не тот, который добавлен с помощью прототипа (Fiddler подтверждает это).

кто-нибудь теперь способ решить эту проблему без определения новой модели?

спасибо заранее.

2 ответов


Я думаю, что лучшим решением здесь является следующее:

Osgaar.prototype.fields.add(new Ext.data.Field({ name: 'fifth', type: 'string'})); // create Ext.data.Field constructor, not just simple Object

я быстро посмотрел на писатель реализации, и вот метод, который вызывается write () при записи данных:

getRecordData: function(record) {
        var isPhantom = record.phantom === true,
            writeAll = this.writeAllFields || isPhantom,
            nameProperty = this.nameProperty,
            fields = record.fields,            // <- look here
            data = {},
            changes,
            name,
            field,
            key;

        if (writeAll) {
            fields.each(function(field){
                if (field.persist) {           // <- checks the persist property!
                    name = field[nameProperty] || field.name;
                    data[name] = record.get(field.name);
                }
            });

затем я проверил значение остаются свойство поля, которое добавляется к прототипу после того, как модель определена и оказалась неопределено. Это потому, что вы на самом деле не создаете ВН.данные.Поле экземпляр, который унаследует все поля по умолчанию и другие полезные вещи, вы просто добавляете простой объект в коллекцию полей. Осгаар.прототип.поля-это просто MixedCollection и так как вы работаете с ним напрямую, нет места, где ВН.данные.Поле конструктор может вызываться неявно.

Если логика приложения часто добавляет поля модели "на лету", рассмотрите возможность реализации добавитьформы() метод для ваших пользовательских моделей (создайте другой базовый класс в цепочке наследования).

надеюсь, это поможет, удачи! Я использую ExtJS довольно долго, так что это было похоже на викторину для меня:)


Я нашел другое решение для моей первоначальной проблемы.

вместо добавления полей в прототип модели я сделал следующее:

Osgaar_Temp = Osgaar;
delete Osgaar;

Ext.define('Osgaar', {
    extend: 'Osgaar_Temp',
    fields: 
    [
        { name: 'typeCategories', type: 'string' }
    ]
});

Это кажется лучшим решением.