Динамическая модель с ExtJS 4 - PullRequest
28 голосов
/ 22 апреля 2011

С ExtJS 3.x я смог использовать свойство «полей» Магазина, но, похоже, с ExtJS 4 я должен абсолютно использовать Модель. Это нормально, но в моем случае это не статическая модель, и мне нужно определить поля на лету, а иногда и изменить их.

Я мог бы воссоздать модель, но мне нужно использовать другое имя, поскольку, очевидно, невозможно изменить существующую модель, а также удалить ее. Если я пытаюсь использовать Ext.regModel с тем же именем, ExtJS вылетает.

Спасибо за вашу помощь!

Ответы [ 3 ]

20 голосов
/ 14 мая 2012

4.1 ОБНОВЛЕНИЕ:

В качестве обновления ... в 4.1 появился статический метод setFields, который можно использовать для определения полей прототипа модели. Это хорошо работает в методе init контроллера.

Когда я сделал это, я хотел, чтобы некоторые статические поля были определены в классе модели, а затем установить некоторые более динамически. К сожалению, новый setFields метод заменяет все поля аргументом, хотя обрабатывать его было достаточно просто.

В этом примере используется шаблон MVC, в котором моя модель и хранилище включены в массив model контроллера и массив store (предоставив мне удобные методы получения, используемые ниже):

Ext.define('ST.controller.Main', {
    extend: 'Ext.app.Controller',

    models: ['User', 'Reference'],

    stores: ['CurrentUser', 'PermissionRef'],

    views: ['MainPanel'],

    init: function() {
        var me = this;

        me.getPermissionRefStore().on('load', function(store, records) {
            var model = me.getUserModel();
                // this returns the static fields already defined 
                // in my User model class
                fields = model.prototype.fields.getRange();

            // add the permission options (dynamic fields) to the static fields
            Ext.each(records, function(permission) {
                fields.push({name: permission.get('name'), type: 'bool'});
            });

            // 4.1 method to update the User model fields
            model.setFields(fields);

            // now load the current user (it will use the updated model)
            me.getCurrentUserStore().load();

        });

    }

});

Модель User и хранилище CurrentUser создаются точно так же, как обычные, не динамические модели, и хранилища будут и включены в соответствующие массивы контроллеров, в модели «Пользователь» просто отсутствуют динамические поля, которые добавляются как показано выше.

17 голосов
/ 24 августа 2011

Я тоже вошел в эту проблему.У меня есть служба, которая отвечает за выборку метаданных с сервера и адаптацию моделей и хранилищ к этим метаданным.

Поэтому я определил пустую модель и настроил хранилище для использования этой модели.

Когда метаданные обрабатываются, я добавляю новые / дополнительные поля в прототип модели следующим образом (metaDataStore - это хранилище, содержащее метаданные, модель - это модель, которую можно получить из менеджера модели):

var fields = [];
metaDataStore.each(function(item) {
    fields.push(Ext.create('Ext.data.Field', {
        name: item.get('field')
    }));
});
model.prototype.fields.removeAll();
model.prototype.fields.addAll(fields);

Когда я затем вызываю load в магазине с использованием этой модели или создаю новые экземпляры модели, новые поля обрабатываются правильно.

3 голосов
/ 27 июня 2011

Вот очень простой пример.Просто используйте обычный Ext.data.Store, но вместо модели укажите свойство fields:

// you can specify a simple string ('totally')
// or an object with an Ext.data.Field ('dynamic')
var fields = ['totally', {name : 'dynamic', type : 'string'}];
var newStore = new MyApp.store.Object({
  fields : fields
  // other options like proxy, autoLoad...
});

Не указывайте свойство модели - похоже, оно переопределит свойство fields.

Я также хотел динамически изменять столбцы и содержимое существующей сетки:

// reconfigure the grid to use the new store and other columns
var newColumns = [
  {header: 'Totally', dataIndex: 'totally'},
  {header: 'Dynamic', dataIndex: 'dynamic'}
];
myGrid.reconfigure(newStore, newColumns);

Из документации Ext JS 4 о свойстве fields Ext.data.Store :

Это может использоваться вместо указания конфигурации модели.Поля должны быть набором объектов конфигурации Ext.data.Field.Хранилище автоматически создаст Ext.data.Model с этими полями.В общем, этого параметра конфигурации следует избегать, он существует для целей обратной совместимости.Для чего-либо более сложного, такого как указание определенного свойства или ассоциаций с идентификатором, необходимо определить и указать Ext.data.Model для конфигурации модели.будущее.

...