【问题标题】:What is the use of initComponent function in extjs4.1?extjs4.1中initComponent函数有什么用?
【发布时间】:2013-05-31 18:05:29
【问题描述】:

谁能告诉我initComponent 函数在extjs4.1 中的用途是什么?请举个例子

谢谢

【问题讨论】:

    标签: extjs extjs4.1 sencha-architect extjs4.2


    【解决方案1】:

    此方法类似于组件的constructor。它由真正的constructor 调用,是一个非常好的自定义组件初始化的挂钩点(正如名字所说!)。

    除了在极少数情况下,您应该覆盖initComponent 而不是constructor,因为更基本的初始化已经发生。最值得注意的是,传递给构造函数的配置对象已经被合并到对象中。

    假设您要自定义组件的配置,例如设置其width。如果您尝试在构造函数中执行此操作,则必须首先检查我们是否已通过配置对象(以避免尝试在undefined 上设置属性),并且您将拥有覆盖配置对象,这是不好的做法。如果您在this 中设置选项,它可能会被配置对象覆盖。如果更改 config 对象中的值,则会修改对象,从而破坏调用代码的预期(即重用 config 对象将产生意想不到的结果)。在initComponent中,值永远是this.width,你不用担心配置。

    另一个有趣的点是initComponent 是创建子组件(用于容器)、商店、视图、模板等的地方。因此,在调用超类 initComponent 方法之前,您可以对它们采取行动,确保它们尚未被使用或需要(例如,添加项目、创建商店等)。另一方面,一旦调用了 super 方法,就可以保证所有这些依赖项都已创建并实例化。例如,这是向依赖项添加侦听器的好地方。

    话虽如此,请记住initComponent 中没有进行任何渲染。子组件已创建和配置,但它们的 DOM 元素尚未创建。要影响渲染,您必须使用渲染相关事件或查找 afterRenderonRender 方法...

    这是一个图解摘要:

    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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-07
      • 1970-01-01
      • 1970-01-01
      • 2011-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-17
      相关资源
      最近更新 更多