EXTJ наследуют конфигурацию

#javascript #inheritance #extjs #constructor #subclass

Вопрос:

В ExtJS 6.2 подклассы наследуют родительскую конфигурацию?

Похоже, у меня это не работает.

 Ext.define('test1', {
    config: {
        test1: {
            test1: ''
        }
    },

    constructor(config) {
        Ext.apply(this, config);

        console.log(config);
    },
});

Ext.define('test2', {
    extend: 'test1',

    config: {
        test2: ''
    },

    constructor(config) {
        this.callParent(config);

        console.log(this.config);
    },
});

Ext.create('test2', {
    test1: {
        test1: 'test1'
     },
     test2: 'test2'
});
 

Также похоже, что на родительском конструкторе config есть undefined !

Я хочу, чтобы все было определено в конфигурации родительского класса, также доступной в дочернем классе. И иметь возможность настраивать родительскую конфигурацию при создании дочернего класса.

Скрипка: https://fiddle.sencha.com/#view/editoramp;fiddle/3fud

Ответ №1:

Вам нужно initConfig, чтобы получить типичные конфигурации ExtJS. Вы получаете все конфигурации внутри test2.

 Ext.define('test1', {
    config: {
        test1: null
    },

    constructor(config) {
        this.initConfig(config);

        return this;
    }
});

Ext.define('test2', {
    extend: 'test1',

    config: {
        test2: ''
    },

    constructor(config) {
// == > config

        this.callParent([config]);

// ==> her you can even use getTest1(), setTest1() (or test2)
    }
});

Ext.create('test2', {
    test1: {
        test1: 'test1'
    },
    test2: 'test2'
});
 

Комментарии:

1. Но как мне сохранить конфигурацию, заданную родителем по умолчанию? Что делать, если я не передам test1 конфигурацию при создании test2 ?

2. Я хочу , чтобы все test1 , что нужно, было test2 включено, включая конфигурацию.

3. Дайте мне знать, если эта скрипка ответит на ваш вопрос

4. Обновленный код внутри ответа

5. Да, это так. Теперь я помню, что раньше у меня были проблемы, потому что параметр конфигурации должен быть массивом, поэтому он был NULL в test1 конструкторе.

Ответ №2:

Один из обходных путей-позвонить Ext.apply(this, config); , не будучи уверенным, что это правильное решение.

 Ext.define('test2', {
    extend: 'test1',

    config: {
        test2: ''
    },

    constructor(config) {
        this.callParent(config);

        Ext.apply(this, config);  // <-

        console.log(this.config);

        console.log(this.getTest1());
        console.log(this.getTest2());
    },
});