好久没用ext了,工作中要用到,想想这次用组件化编程方式吧。因为,之前的写法太垃圾了。个人认为组件化的好处是,相对降低对象的生命周期,其它方面的暂时没考虑到——没好好学过js,就学用框架。当然,回顾还是看别人的代码。一番寻找,找到了dojochina的一个例子。
该实例实现了grid与form间的数据交互,所有数据均为临时存储。代码如下:
/**
* 扩展验证
*/
Ext.apply(Ext.form.VTypes, {
'age':function(_v){
if(/^\d+$/.test(_v))
{
var _age = parseInt(_v);
if(_age < 200)
return true;
}
},
'ageText':'该选项必须输入,例如:24',
'ageMask':/[0-9]/i
});
/**
* 定义form
*/
PersonInfoFormPanel = Ext.extend(Ext.form.FormPanel, {
constructor: function(){
PersonInfoFormPanel.superclass.constructor.apply(this, [{
baseCls: "x-plain",
buttonAlign: "right",
labelWidth:30 ,
defaultType: "textfield",
defaults: {
anchor: "95%"
//labelStyle: "text-align:right"//设定后文本框和标签占据同一区域
},
items: [{
fieldLabel: "姓名",
name: "name"
}, {
fieldLabel: "年龄",
name: "age",
vtype: "age"//验证年龄(通过vtype类型来验证)
}, {
xtype: "combo",
mode: "local",//本地数据
readOnly: true,
fieldLabel: "性别",
displayField: "sex",//显示下拉框的内容
triggerAction: "all",//在选择时,显示所有的项
value: "男",//默认值
store: new Ext.data.SimpleStore({
fields: ["sex"],
data: [["男"], ["女"]]
}),
name: "sex"//绑定字段
}]
}])
},
//---以下为PersonInfoFormPanel类对外提供的方法---
getValues: function(){
if (this.getForm().isValid())
return new Ext.data.Record(this.getForm().getValues());
else
throw new Error("验证没有通过");//自定义异常
},
setValues: function(_r){
this.getForm().loadRecord(_r);
},
reset: function(){
this.getForm().reset();
}
});
/**
* 定义window
*/
baseWindow = Ext.extend(Ext.Window, {
form: null,
constructor: function(){
this.form = new PersonInfoFormPanel();//实例化PersonInfoFormPanel类
baseWindow.superclass.constructor.apply(this, [{
modal: true,
resizable: false,
plain: true,
width:350,
items:this.form,
buttonAlign:'right',
closeAction:'hide',
bodyStyle:{'padding':'10px 0 10px 10px'},
items: this.form,
buttons: [{
text: "确 定",
handler:this.onSubmitClick,//提交事件调用
scope: this
}, {
text: "取 消",
handler:this.onCancelClick,//取消事件调用
scope: this
}]
}]);
//给insertWindow对象添加事件(事件冒泡)
this.addEvents("submit");
},
//提交事件处理函数
onSubmitClick: function(){
try {
//发布事件
this.fireEvent("submit", this, this.form.getValues());//调用PersonInfoFormPanel类中自定义的方法getValues
this.close();
}
catch (_err) {
Ext.Msg.alert("系统提示", _err.description);//扑捉自定义错误或异常
}
},
//取消事件处理函数
onCancelClick: function(){
this.close();
},
//重置与隐藏事件处理函数
close: function(){
this.form.reset();
this.hide();
}
});
/**
* 增加人员窗口
*/
insertWindow = Ext.extend(baseWindow, {
title: "新增人员"
});
/**
* 修改人员窗口
*/
updateWindow = Ext.extend(baseWindow, {
title: "修改人员",
load: function(_r){
this.form.setValues(_r);
}
});
/**
* 人员列表
*/
PersonListGridPanel = Ext.extend(Ext.grid.GridPanel, {
_window: null,
_updateWin: null,
constructor: function(_url){
this._window = new insertWindow();//insertWindow对象引用
this._updateWin = new updateWindow();//updateWindow对象引用
PersonListGridPanel.superclass.constructor.apply(this, [{
renderTo: Ext.getBody(),
width:325 ,
height:200 ,
frame: true,
autoScroll:true,
layout: "form",
//工具栏
tbar: [{
text: "添加人员",
handler: function(){
this._window.show();
},
scope: this
}, "-", {
text: "修改人员",
handler: function(){
this._updateWin.show();
try {
this._updateWin.load(this.getSelected());
}
catch (_err) {
Ext.Msg.alert("系统提示", _err.description);
this._updateWin.close();
}
},
scope: this
}, "-", {
text: "删除",
handler: this.onRemovePerson,
scope: this
}],
enableColumnMove: false,
//列模板
columns: [{
header: "姓名",
menuDisabled: true,
dataIndex: "name"
}, {
header: "年龄",
menuDisabled: true,
dataIndex: "age"
}, {
header: "性别",
menuDisabled: true,
dataIndex: "sex"
}],
//内存数据
store: new Ext.data.Store({
proxy: new Ext.data.MemoryProxy([['张三','24','男'],['李四','23','女'],['王五','25','男'],['赵六','27','女'],['木易','26','男']]),
reader:new Ext.data.ArrayReader({},['name','age','sex']),
autoLoad:true
}),
/*store: new Ext.data.JsonStore({
autoLoad: true,
url: _url,
fields: ["name", "age", "sex"]
}),*/
//选中模板
selModel: new Ext.grid.RowSelectionModel({
singleSelect: true,
listeners: {
"rowselect": {
fn: this.onRowSelected,
scope: this
}
}
})
}]);
//添加事件
this.addEvents("rowselect");
//事件订阅
this._window.on("submit", this.onInsertWinSubmit, this);
this._updateWin.on("submit", this.onUpdateWinSubmit, this);
},
//----- 以下为自定义方法---------
//获得选中的记录
getSelected: function(){
var _sm = this.getSelectionModel();
if (_sm.getCount() == 0)
throw new Error("你没有选中任何记录,请选择一条记录后重试");
return _sm.getSelected();
},
//插入一条记录
insert: function(_r){
this.getStore().add(_r);
},
//更新选中的记录
update: function(_r){
try {
var _rs = this.getSelected();
var _data = _rs.data;
for (var _i in _data) {
_rs.set(_i, _r.get(_i));
};
_rs.commit();
}
catch (_err) {
}
},
//删除选中的记录
remove: function(){
try {
var _rs = this.getSelected();
Ext.Msg.confirm("系统提示", "你确定删除吗?", function(_btn){
if (_btn == "yes")
this.getStore().remove(_rs);
}, this);
}
catch (_err) {
Ext.Msg.alert("系统提示", _err.description);
}
},
//-------以下为自定义事件处理函数------------
//添加事件
onInsertWinSubmit: function(_win, _r){
this.insert(_r);
},
//修改事件
onUpdateWinSubmit: function(_win, _r){
this.update(_r);
},
//删除事件
onRemovePerson: function(){
this.remove();
},
//选中事件
onRowSelected: function(_sel, _index, _r){
this.fireEvent("rowselect", _r);//发布事件
}
})
分享到:
相关推荐
首先需要定义数据源,然后配置列模型,最后实例化Grid组件,并启用分页工具栏。 #### 使用Ajax EXT通过Ajax技术实现了客户端与服务器端的无刷新数据交换,提高了用户体验。 **PHP** 在PHP环境下,可以通过配置...
EXT2.0是EXT库的一个早期版本,它提供了丰富的用户界面组件,包括GRID,用于展示大量结构化数据。 EXT2.0 GRID组件是EXT库中的核心部分,它允许开发者以表格形式显示数据,并提供了一系列功能,如排序、分页、筛选...
综上所述,EXT form与Servlet的交互是一个涉及前端和后端协同的过程,利用EXT的组件化和AJAX特性,可以创建出交互性强、用户体验良好的Web应用。同时,EXT提供的丰富配置和定制选项使得开发者能够根据需求进行精细的...
总的来说,通过组合使用Ext的Grid、Form和Dialog组件,开发者可以构建出功能完善的Web应用,实现数据的展示、编辑和管理。这些组件提供了丰富的API和灵活性,使得开发复杂用户界面变得相对简单。理解并熟练运用这些...
### Ext组件概述与详解 #### 一、Ext基础组件 **1.1 Box Component (Ext.BoxComponent)** - **xtype**: `box` - **功能描述**:Box Component 是一个非常基本的 Ext 组件,主要用于定义具有边框和其他布局属性的...
- 文件"EXT组件grid+tree+window.docx"很可能包含了EXTJS组件的具体实现代码,以及代码中的关键属性和方法解释,帮助初学者理解组件的工作原理和配置方式。 - "role"和"rolePermission"可能是示例中的数据模型或者...
除了以上提到的MessageBox和Grid之外,EXT还提供了大量的其他组件,如Form、TabPanel、Tree等,满足多样化的用户界面需求。 #### 使用Ajax Ajax是现代Web应用不可或缺的一部分,它使得页面可以在不重新加载的情况...
在Ext JS这个强大的JavaScript框架中,`Grid...在深入研究`Ext Grid CellEdit`的过程中,了解和掌握组件化开发思想、事件处理机制以及数据绑定原理是非常重要的,这些知识点能够帮助你更好地驾驭此类自定义插件的开发。
"Ext Form GridPanel"是Ext JS库中的一个重要组件,它结合了表格(Grid)和表单(Form)的功能,提供了一种强大而灵活的方式来显示和编辑数据。在Web应用程序开发中,这种组件常用于数据录入和展示,尤其适用于处理...
通过查阅API,开发者可以迅速了解如何创建组件、配置属性、监听事件以及与其他EXT组件交互。例如,EXT的GridPanel组件,它用于展示二维数据,并支持排序、分页和行操作,API中会详细解释如何创建GridPanel,配置...
2. **ExtGrid**:ExtGrid是Ext JS中的表格组件,用于显示结构化的数据。它支持多种功能,如排序、过滤、分页、行编辑等。在本例中,开发者创建了一个具有这些特性的ExtGrid实例。 3. **数据展示**:在ExtGrid中,...
EXT可视化编辑工具是一种高效、便捷的网页开发利器,旨在提升编程人员的开发效率,与知名的Dreamweaver类似。它提供了一种所见即所得(WYSIWYG)的界面,使得开发者无需深入HTML、CSS和JavaScript的底层细节,就能...
然而,获取`Ext.Store`的方式并不像获取其他Ext组件那样直接,因为Store并不是一个具有可视界面的组件,它是一个纯粹的数据容器。 在传统的创建`Ext.Store`的方法中,我们通常会这样定义一个Store: ```javascript...
- **组件化设计**:EXT4.3中的表单基于组件模型,可以方便地创建、添加、删除和修改表单字段。通过`Ext.form.FieldSet`和`Ext.container.Container`等类,开发者可以构建复杂的动态表单结构。 - **动态生成**:...
Grid支持排序、分页、行选择等多种功能,可以轻松地与各种数据源进行交互。EXT Form则是用于创建用户输入表单的工具,它提供了各种表单字段类型,并支持验证,使用户输入的数据更规范。 EXT JS的事件处理系统也是其...
在实际应用中,开发者可能需要将EXT Date与其他EXT组件(如Grid、Form等)结合,实现日期输入、日期显示、日期检索等功能,以提升应用程序的交互性和实用性。 在压缩包"ext-date"中,可能包含了EXT Date控件的源码...
`Ext.data`是Ext框架的核心模块之一,它主要负责封装与数据相关的各种操作。该模块下包括了多个子类,例如`Ext.data.Store`、`Ext.data.DataProxy`以及`Ext.data.DataReader`等,这些子类共同协作完成数据的加载、...
当我们谈论`ExtJS Grid`时,我们指的是一个强大的数据展示组件,它可以显示大量结构化的数据,并提供排序、分页、过滤等功能。在`Grid`中集成日期时间控件和Spinner控件,可以使用户直接在表格单元格内进行日期和...
Ext2.0包含了一系列的UI组件,如面板(Panel)、表格(Grid)、表单(Form)、菜单(Menu)、按钮(Button)、工具栏(Toolbar)、树形视图(Tree)等。这些组件都具有高度可配置性和可扩展性,能够满足各种复杂的...
EXT Grid 是一个强大的数据网格组件,广泛应用于EXT JS框架中,用于展示和操作大量结构化数据。表头的三层插件则是EXT Grid的一种扩展功能,它允许用户在表头部分实现更为复杂和多层次的布局,以更好地管理和组织...