Что такое использование функции 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();
}