【发布时间】:2013-05-31 18:05:29
【问题描述】:
谁能告诉我initComponent 函数在extjs4.1 中的用途是什么?请举个例子
谢谢
【问题讨论】:
标签: extjs extjs4.1 sencha-architect extjs4.2
谁能告诉我initComponent 函数在extjs4.1 中的用途是什么?请举个例子
谢谢
【问题讨论】:
标签: extjs extjs4.1 sencha-architect extjs4.2
此方法类似于组件的constructor。它由真正的constructor 调用,是一个非常好的自定义组件初始化的挂钩点(正如名字所说!)。
除了在极少数情况下,您应该覆盖initComponent 而不是constructor,因为更基本的初始化已经发生。最值得注意的是,传递给构造函数的配置对象已经被合并到对象中。
假设您要自定义组件的配置,例如设置其width。如果您尝试在构造函数中执行此操作,则必须首先检查我们是否已通过配置对象(以避免尝试在undefined 上设置属性),并且您将拥有覆盖配置对象,这是不好的做法。如果您在this 中设置选项,它可能会被配置对象覆盖。如果更改 config 对象中的值,则会修改对象,从而破坏调用代码的预期(即重用 config 对象将产生意想不到的结果)。在initComponent中,值永远是this.width,你不用担心配置。
另一个有趣的点是initComponent 是创建子组件(用于容器)、商店、视图、模板等的地方。因此,在调用超类 initComponent 方法之前,您可以对它们采取行动,确保它们尚未被使用或需要(例如,添加项目、创建商店等)。另一方面,一旦调用了 super 方法,就可以保证所有这些依赖项都已创建并实例化。例如,这是向依赖项添加侦听器的好地方。
话虽如此,请记住initComponent 中没有进行任何渲染。子组件已创建和配置,但它们的 DOM 元素尚未创建。要影响渲染,您必须使用渲染相关事件或查找 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();
}
【讨论】: