Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Ext4.2 Как в конструкторе объединить конфигурацию при наследовании (https://javascript.ru/forum/extjs/71711-ext4-2-kak-v-konstruktore-obedinit-konfiguraciyu-pri-nasledovanii.html)

small75 07.12.2017 11:59

Ext4.2 Как в конструкторе объединить конфигурацию при наследовании
 
Имеем Extjs 4.2
Как мне объединить дефолтную конфигурацию в описании класса и передаваемую конфигурацию при создании объекта?
Проблема в свойствах класса, которые содержат подобъекты со своими конфигурациями.
Пример кода ниже. Основная проблема с "proxy".
Как правильно объединять конфигурации?

Ext.define('Adm.EmptyModel', {
    extend: 'Ext.data.Model',
});

Ext.define('Adm.AclMain', {
    extend: 'Ext.data.Store',
    model: 'Adm.EmptyModel',
    title: 'AclMain',
    autoSync: true,
    autoLoad: false,
    //autoLoad: true,
    proxy: {
        //api: {},
        type: 'ajax',
        reader: {
            type: 'json',
            root: 'data',
            idProperty: 'ID',
            messageProperty: 'message',
            successProperty: 'success'},
        writer: {
            type: 'json',
            root: 'data',
            encode: true
        }
    },
    constructor: function (config) {
        var me = this;
      //me.callParent(); -- только предустановленные при описании класса поля
        //Ext.apply(me, config); -- перезаписывает свойство proxy, но мне надо объединить конфигурации
        //Ext.applyIf(me, config); -- не объединяет конфигурации свойства proxy, оставляется только предустановленное
        //me.callParent(arguments);-- перезаписывает свойство proxy, но мне надо объединить конфигурации
    }});

var store_users = Ext.create('Adm.AclMain', {
    storeId: 'store_users',
    title: 'Users',
    fields: ['ID', 'NAME', 'FULL_NAME', 'EMAIL', 'PHONE'],
    proxy: {
        api: {
            read: 'd_users.php',
            update: 'd_users_edit.php?action=update',
            create: 'd_users_edit.php?action=create',
            destroy: 'd_users_edit.php?action=delete'
        }
    }
});

siber-biber 07.12.2017 18:29

constructor: function (config) {
    config = config || {};
    Ext.merge(this.proxy, config.proxy);
    delete config.proxy;
    this.callParent(arguments);
}

siber-biber 07.12.2017 18:32

ну или если не проканает:
constructor: function (config) {
    config = config || {};
    config.proxy = Ext.merge({}, this.proxy, config.proxy);
    this.callParent(arguments);
}

small75 08.12.2017 09:56

спасибо.
я так и предполагал, что придется каждое свойство отдельно обрабатывать.

А нет ли возможности получить текущую конфигурацию объекта this ? А потом сделать merge.

siber-biber 11.12.2017 11:18

вы имеете в виду весь конфиг инстанса смержить с прототипом класса?
если да, то конечно технически можно и так сделать
constructor: function (config) {
    Ext.merge(this, config);
    // reset config object ..since we've just applied it manually
    config = {};
    this.callParent(arguments);
}

..но лично я бы не стал.
Не изучал код Ext.merge так-что не уверен что он обрабатывает например цикличные ссылки, а extjs их местами делает.
Да и для всех конфигов такое просто не нужно.


Часовой пояс GMT +3, время: 12:02.