首页 > 代码库 > 【ExtJS】关于constructor、initComponent、beforeRender

【ExtJS】关于constructor、initComponent、beforeRender

  ExtJS提供的组件非常丰富,不过当原生的组件无法满足要求时,就需要扩展原生自定义组件了。

  initComponent 和 constructor 就是Extjs 提供用来实现继承和扩展的方式。

  在Extjs 中使用Ext.define来实现扩展, initComponent 和 constructor的使用方式类似:

1 Ext.define(‘My.panel.Panel‘, {  2     extend : ‘Ext.panel.Panel‘,  3     initComponent : function() {  4         //do something  5     },  6     constructor : function() {  7         //do something  8     }  9 });  

  一般状况上,加上 xtype 的定义, 类似:

 1 Ext.define(‘My.panel.Panel‘, {   2     extend : ‘Ext.panel.Panel‘, 3     xtype: ‘myPanel‘, 4     initComponent : function() {   5         //do something   6     },   7     constructor : function() {   8         //do something   9     }  10 });  

  initComponent这个方法是在Ext.Component的构造函数(constructor)中调用的,只有直接或间接继承自 Ext.Component的类才会在constructor里调用initComponent方法。

  自定义类中的 initComponent 函数中必须调用 callParent();否则 调用者无法初始化这个对象。

  针对button 这样的扩展组件来说,自定义类中的  constructor ,需要调用callParent( arguments);否则 调用者无法初始化这个对象。

  在下面的例子中:

 1 Ext.define(‘My.form.Panel‘,{ 2     extend: ‘Ext.panel.Panel‘, 3     xtype: ‘form-panel‘, 4      5     title: ‘form-panel‘, 6     width: 400, 7     height: 300, 8      9     defaultType: ‘textfield‘,10     11     items: [{12         allowBlank: false,13         fieldLabel: ‘Name:‘,14         name: ‘name‘,15         emptyText: ‘Name ID‘16     },{17         allowBlank: false,18         fieldLabel: ‘Password:‘,19         name: ‘password‘,20         emptyText: ‘password‘,21         inputType: ‘password‘22     },{23         xtype: ‘checkbox‘,24         fieldLabel: ‘Sex‘,25     }],26     buttons: [{27         text: ‘OK‘28     },{29         text: ‘Cancel‘30     }],31     32     constructor: function(){33         this.renderTo = Ext.getBody();34         this.callParent(arguments);35         Ext.Msg.alert(‘constructor‘,‘Constructor!‘);36     },37     38     initComponent: function(){39         Ext.Msg.alert(‘InitComponent‘,‘InitComponent!‘);40         var me = this;41         me.defaults = {42             anchor: ‘100%‘,43             labelWidth: 10044             45         };46         me.callParent();47     48     },49     50     beforeRender: function(){51         Ext.Msg.alert(‘beforRender‘,‘beforerender!‘);52         this.callParent();53     }54 })55 56 Ext.onReady(function(){57     Ext.create(‘My.form.Panel‘).show();58 59 })

  对容器的renderTo一般写在constructor中,如果写在initComponent中,则配置对象为容器内的几个组件。

  而对于容器内的几个组件的默认配置,则一般写在initComponent内。

  通过分别在constructor、initComponent、beforeRender中加入输出语句实验发现,三者的调动顺序为constructor --> beforeRender --> initComponent。

  通过对ExtJS的生命周期的了解,在初始化阶段,首先调用了构造器constructor,一般从  Component 继承下来的类并不需要提供(通常没有提供)一个独立的构造器。然后是各种事件的创建以供各组件的调用,随后是 ComponentMgr 中注册组件实例,从而可以通过 Ext.getCmp 被获得实例引用,然后调用initComponent 方法,这是一个最重要的初始化步骤,它是做为一个模板方法,子类可以按需要重写这个方法。最后呈现阶段, 如果有配置 renderTo 或 applyTo,组件会马上被呈现输出,否则,它会被延迟输出,直
到组件被显式调用显示,或被它的容器所调用输出。而beforeRender是在组件渲染 rendered之前触发,一般扩展的新组件与元素的初始化配置,就写在beforeRender内。

【ExtJS】关于constructor、initComponent、beforeRender