最近打算对项目中用到ExtJS不分代码进行一次重构。采用OOP的方式对组建进行封装,增强UI组件的复用性,降低js部分的代码量。
介绍完起因,下面开始介绍如何扩展ExtJS的UI组件.
注意: 这里不涉及Ext4.x的内容
Ext提供了Ext.extend(parentObject, newObject):Object 用来解决js的Object继承问题
在扩展UI组建时,需要关注 initComponent 和 onRender 两个方法:
Ext.namespace("dy.grid");
/*
扩展一个Grid, 用来显示名称。更多的扩展可以看 EditGrid 源码.
*/
dy.grid.NameGrid = Ext.extend(Ext.grid.GridPanel, {
title: 'This is my grid panel',
width: 500,
height: 400,
// component组件的初始化方法,类似Java中的构造方法
initComponent : function() {
// 初始化父类Component, 类似Java中的super(), 必须要显示调用
dy.grid.NameGrid.superclass.initComponent.apply(this, arguments);
this.store = new Ext.data.Store({
autoLoad: true,
proxy: new Ext.data.HttpProxy({
url: '/js/data.json'
}),
reader: new Ext.data.JsonReader({
idProperty: 'id',
root: 'rows',
totalProperty: 'result',
fields: [
{name: 'id', type: 'int'},
{name: 'name', type: 'string'},
{name: 'tech', type: 'java'}
]
})
});
},
// 渲染的时候会调用这个方法,内部组件的添加可以放这里
onRender: function() {
// super.render, 必须要显示调用
dy.grid.NameGrid.superclass.onRender.apply(this, arguments)
},
// column module, short name is cm
columns: [{
id: 'name',
header: 'Name',
dataIndex: 'name'
}, {
id: 'tech',
header: 'Tech',
dataIndex: 'tech'
}]
});
// registry xtype
Ext.reg('namegrid', dy.grid.NameGrid)
cd extoop
bundle install
ruby app.rb
用eclipse新建一个Dynamic Web Project, 然后把extoop/public扔到 WebContent目录下即可。
扩展ExtJS组件: http://extjs.org.cn/node/286