extjs4.1中initComponent函数有什么用? [英] What is the use of initComponent function in extjs4.1?

查看:13
本文介绍了extjs4.1中initComponent函数有什么用?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Can anybody tell me what the use of the initComponent function is in extjs4.1? Please provide an example

谢谢

推荐答案

这个方法类似于组件的constructor.它由真正的构造函数调用,是一个非常好的自定义组件初始化的钩子点(正如名字所说!).

This method is akin to a constructor for components. It is called by the true constructor, and is a really good hook point to customize the initialization of the component (as said in the name!).

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

Except in some very rare occasions, you should override initComponent instead of the constructor because the more basic initialization will already have taken place. Most notably, the config object passed to the constructor will have already been merged into the object.

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

Let's say you want to customize the configuration of a component, like setting its width. If you try to do that in the constructor, you'll have to check first whether we've been passed a config object or not (to avoid trying to set a property on undefined), and you'll have the override the config object which is bad practice. If you set the option in this, that may get overridden by the config object. If you change the value in config object, you modify the object, breaking expectations from the calling code (i.e. reusing the config object will have unexpected result). In initComponent, the value will always be this.width, you don't have to worry about the config.

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

Another interesting point is that initComponent is the place where child components (for container), stores, view, templates, etc., are created. So, before calling the superclass initComponent method, you can act on these being sure they've not already been used or needed (e.g. adding items, creating the store, etc.). On the other hand, once you've called the super method, you are guaranteed that all this dependencies have been created and instantiated. So that's the good place to add listeners to dependencies, for example.

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

That being said, keep in mind that no rendering is taking place in initComponent. Child components are created and configured, but their DOM elements have not been created. To affect the rendering, you'll have to use rendering related events or look for the afterRender or onRender methods...

这是一个插图摘要:

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

这篇关于extjs4.1中initComponent函数有什么用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆