Что такое использование функции initComponent в extjs4.1?

может кто-нибудь сказать мне, что использование в extjs4.1? Пожалуйста, приведите пример

спасибо

1 ответов


этот метод сродни constructor для компонентов. Он называется истинным constructor, и это действительно хорошая точка крюк для настройки инициализации компонента (как сказано в названии!).

за исключением некоторых очень редких случаев, вы должны переопределить initComponent вместо constructor потому что более базовая инициализация уже будет иметь место. Прежде всего, объект config, переданный конструктору, уже будет объединен в объект.

предположим, вы хотите настроить конфигурацию компонента, например, установить его width. Если вы попытаетесь сделать это в конструкторе, вам придется сначала проверить, передан ли нам объект config или нет (чтобы избежать попытки установить свойство на undefined), и у вас будет переопределение объекта config, что является плохой практикой. Если вы установите параметр в this, который может быть переопределен объектом config. Если изменить значение в объекте config, можно изменить объект, нарушающий ожидания от вызывающего кода (т. е. повторное использование объекта config будет иметь неожиданный результат). В initComponent, значение всегда будет this.width, вам не нужно беспокоиться о конфигурации.

еще один интересный момент заключается в том, что initComponent - это место, где дочерние компоненты (для контейнера), магазины, красивый вид, шаблоны, и т. д. создаются. Итак, перед вызовом суперкласса initComponent метод, вы можете действовать на них, будучи уверенным, что они не были использованы или необходимы (например, добавление товаров, создания магазина, и т. д.). С другой стороны, после вызова метода super вам гарантируется, что все эти зависимости были созданы и созданы. Так что это хорошее место для добавления слушателей в зависимости, например.

это, как говорится, имейте в виду, что никакого рендеринга не происходит в initComponent. Дочерние компоненты создаются и настраиваются, но их элементы DOM не были созданы. Чтобы повлиять на рендеринг, вам придется использовать rendering related события или искать afterRender или onRender методы...

вот иллюстрированное резюме:

constructor: function(config) {

    // --- Accessing a config option is very complicated ---

    // unsafe: this may be changed by the passed config
    if (this.enableSomeFeature) { ... }

    // instead, you would have to do:
    var featureEnabled;
    if (config) { // not sure we've been passed a config object
        if (Ext.isDefined(config.featureEnabled)) {
            featureEnabled = config.featureEnabled;
        } else {
            featureEnabled = this.enableSomeFeature;
        }
    } else {
        featureEnabled = this.enableSomeFeature;
    }
    // now we know, but that wasn't smooth
    if (featureEnabled) {
        ...
    }


    // --- Even worse: trying to change the value of the option ---

    // unsafe: we may not have a config object
    config.enableSomeFeature = false;

    // unsafe: we are modifying the original config object
    (config = config || {}).enableSomeFeature = false;

    // cloning the config object is safe, but that's ineficient
    // and inelegant
    config = Ext.apply({enableSomeFeature: false}, config);


    // --- Super method ---

    this.callParent(arguments); // don't forget the arguments here!

    // --------------------

    // here initComponent will have been called
}

,initComponent: function() {

    // --- Accessing config options is easy ---

    // reading
    if (this.enableSomeFeature) { ... }

    // or writing: we now we change it in the right place, and
    // we know it has not been used yet
    this.deferRender = true;


    // --- Completing or changing dependant objects is safe ---
    // items, stores, templates, etc.

    // Safe:
    // 1. you can be sure that the store has not already been used
    // 2. you can be sure that the config object will be instantiated
    //    in the super method
    this.store = {
        type: 'json'
        ...
    };


    // --- However that's too early to use dependant objects ---

    // Unsafe: you've no certitude that the template object has
    // already been created
    this.tpl.compile();


    // --- Super method ---

    this.callParent();

    // --------------------


    // Safe: the store has been instantiated here
    this.getStore().on({
        ...
    });


    // will crash, the element has not been created yet
    this.el.getWidth();
}