Ext面向对象开发实践代码第1/2页_YUI.Ext相关

示例程序简述:
这个Demo为了演示如将使用GridPanel显示数据,并为GridPanel添加工具条按钮,提供弹出式窗体新增数据。
使用到的Ext组件
这个Demo涉及到Ext中的GridPanel,FormPanel和Window三个组件。
效果图


现在开始讲解代码,首先看一下创建GridPanel的代码片段

复制代码 代码如下:

//定义数据列表面板类
PersonListGridPanel = Ext.extend(Ext.grid.GridPanel, {
insertWin: null,
updateWin: null,

constructor: function() {
//添加自定义事件
this.addEvents("rowSelect");

this.insertWin = new InsertPersonInfoWindow();
this.insertWin.on("submit", this.onInsertWinSubmit, this);

this.updateWin = new UpdatePersonInfoWindow();
this.updateWin.on("submit", this.onUpdateWinSubmit, this);

PersonListGridPanel.superclass.constructor.call(this, {
renderTo: Ext.getBody(),
width: 360,
height: 300,
frame:true,
sm: new Ext.grid.RowSelectionModel({
singleSelect:true,
listeners: {
"rowselect": {
fn: function(sm, rowIndex, r) {
this.fireEvent("rowSelect", r); //触发自定义事件
},
scope: this
}
}
}),
store: new Ext.data.JsonStore({
data: [{name: "李宗盛", age: 28, sex: "男"}, {name: "林忆莲", age: 26, sex: "女"}],
fields: ["name", "sex", "age"]
}),
draggable: false,
enableColumnMove: false,
title: "First Grid",
//iconCls:'icon-grid',
colModel: new Ext.grid.ColumnModel([
{header: "Staff Name", width: 100, menuDisabled: true},
{header: "Age", width: 100, sortable: true, dataIndex: "age", align: "right", tooltip: "这里是提示信息"},
{header: "Sex", width: 100, sortable: true, dataIndex: "sex", align: "center"}
]),
tbar: [{
text: "添加人员",
handler: function() {
//***************************************************
//如果没有重写InsertPersonInfoWindow的Close方法
//在调用之前需要检查其实例insertWin是否被释放
//使用示例:
//if (!this.insertWin) {
// this.insertWin = new InsertPersonInfoWindow();
//}
//this.insertWin.show();
//***************************************************
this.insertWin.show();
},
scope: this
}, "-", {
text: "修改人员",
handler: function() {
var r = this.getActiveRecord();
if (!r) return;

//一定要先调用Show方法,而后再调用Load方法,
//否则数据不会被呈现出来
this.updateWin.show();
this.updateWin.load(r);
},
scope: this
}, "-", {
text: "删除人员",
handler: function() {
var r = this.getActiveRecord();
if (!r) return;
Ext.MessageBox.confirm("删除", "删除当前人员信息?", function(btn) {
if(btn == "yes") {
this.delRecord(r);
}
}, this);
},
scope: this
}]
});
},
getActiveRecord: function() {
var sm = this.getSelectionModel();
//没有选中的记录时,是抛出异常还是返回null???????
return (sm.getCount() === 0) ? null : sm.getSelected();
},
insert: function(r) {
this.getStore().add(r);
},
delRecord: function(r) {
this.getStore().remove(r);
},
onInsertWinSubmit: function(win, r) {
this.insert(r);
},
onUpdateWinSubmit: function(win, r) {
alert('onUpdateWinSubmit');
}
});

数据维护面板代码

复制代码 代码如下:

//定义数据维护面板,在后面定义的新增和修改窗体中都会使用到该面板
PersonInfoFormPanel = Ext.extend(Ext.form.FormPanel, {
constructor: function() {
PersonInfoFormPanel.superclass.constructor.call(this, {
//title: "Person Info",
frame: true,
width: 360,
labelWidth: 40,
defaultType: "textfield",
defaults: { anchor: "92%" },
items: [{
name: "name", //注意,这里使用name属性而不是id,因为PersonInfoFormPanel会被添加和插入两个窗体使用,使用id会有冲突,导致组件不能被正确显示
fieldLabel: "Name",
allowBlank: false,
emptyText: "请输入姓名",
blankText: "姓名不能为空"
}, {
name: "age",
fieldLabel: "Age",
vtype: "age"
}, {
hiddenName: "sex",
xtype: "combo",
fieldLabel: "Sex",

store: new Ext.data.SimpleStore({
fields: [
{name: 'Sex'}
],
data:[["男"], ["女"]]
}),
mode: 'local',
displayField:'Sex',
triggerAction: 'all',
emptyText:'选择性别...'
}]
})
},
getValues: function() {
if (this.getForm().isValid()) {
return new Ext.data.Record(this.getForm().getValues());
}
else {
throw Error("Error Message");
}
},
setValues: function(r) {
this.getForm().loadRecord(r);
},
reset: function() {
this.getForm().reset();
}
});

对数据的维护有新增和更新两个动作,从设计的角度来讲就需要编写两个窗体对其进行操作。细心的朋友一定会想,新增和更新的动作都是针对相同的数据表,那么能不能只写一个窗体,然后复用呢?答案是肯定的。下面我们就先写一个窗体基类。

复制代码 代码如下:

//新增,修改窗体基类
PersonInfoWindow = Ext.extend(Ext.Window, {
form: null,

constructor: function() {
this.addEvents("submit");

this.form = new PersonInfoFormPanel();

//Ext.apply(this.form, {baseCls: "x-plain"});
PersonInfoWindow.superclass.constructor.call(this, {
plain: true,
width: 360,
modal: true, //模式窗体
onEsc: Ext.emptyFn,
closeAction: "hide",
items: [this.form],
buttons: [{
text: "确 定",
handler: this.onSubmitClick,
scope: this
}, {
text: "取 消",
handler: this.onCancelClick,
scope: this
}]
});
//alert(this.onSubmitClick);
},
close: function() {
//需要重写CLose方法,
//否则在窗体被关闭其实体会被释放
this.hide();
this.form.reset();
},
onSubmitClick: function() {
//alert(Ext.util.JSON.encode(this.form.getValues().data));
try {
this.fireEvent("submit", this, this.form.getValues());
this.close();
}
catch(_err) {
return;
}
},
onCancelClick: function() {
this.close();
}
});

基类写了之后,我们就可以使用继承的方法来编写新进和更新窗体了。

复制代码 代码如下:

//定义新增数据窗体
InsertPersonInfoWindow = Ext.extend(PersonInfoWindow, {
title: "添加"
});

//==============================================================================

复制代码 代码如下:

//定义编辑数据窗体
UpdatePersonInfoWindow = Ext.extend(PersonInfoWindow, {
title: "修改",
load: function(r) {
this.form.setValues(r);
}
});

为了区分新增和更新窗体,我们在其各自的实现类中为其指定了Title属性,另外在更新窗体类中需要另外添加一个用于加载待编辑数据的方法Load。

脚本部分算是完成了,下面看看如何在HTML中使用。HTML中的引用代码 

复制代码 代码如下:

<script type="text/javascript">
Ext.QuickTips.init();
Ext.form.Field.prototype.msgTarget = "side";
Ext.BLANK_IMAGE_URL = "http://localhost:8080/ext-2.2/resources/images/default/s.gif";

Ext.apply(Ext.form.VTypes, {
"age": function(_v) {
if (/^\d+$/.test(_v)) {
var _age = parseInt(_v);
if ((_age > 0) && (_age < 200)) return true;
}
return false;
},
"ageText": "年龄必须在0到200之间",
"ageMask": /[0-9]/i
});

Ext.onReady(function() {
new PersonListGridPanel();
});
</script>

代码很简洁,也很清晰。只需要创建一个PersonListGridPanel即可,因为它自身包含了新增、修改的窗体对象,而新增和修改窗体中都使用到了负责数据编辑的PersonInfoFormPanel。
在PersonInfoFormPanel中使用了VTypes进行数据验证。
新增和修改窗体仅仅是界面,负责将用户在PersonInfoFormPanel中填写的数据传回到ListGrid中以便保存,或是将ListGrid中的数据传递到PersonInfoFormPanel中进行呈现,供用户编辑。

当前1/2页 12下一页阅读全文

时间: 2024-07-31 03:33:03

Ext面向对象开发实践代码第1/2页_YUI.Ext相关的相关文章

EXT富客户端后台管理系统 初步代码第1/2页_YUI.Ext相关

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <ti

ext form 表单提交数据的方法小结_YUI.Ext相关

EXT的form表单ajax提交(默认提交方式)  复制代码 代码如下:  1. function login(item) {    2.    3. if (validatorForm()) {    4. // 登录时将登录按钮设为disabled,防止重复提交    5. this.disabled = true;    6.    7. // 第一个参数可以为submit和load    8. formPanl.form.doAction('submit', {    9.    10.

ext 列表页面关于多行查询的办法_YUI.Ext相关

首先在Ext.grid.GridPanel中必须要有tbar对象 然后要增加listeners: { 'render': function() { bbar2.render(this.tbar); //add one tbar //twoTbar.render(this.tbar); //add two tbar // threeTbar.render(this.tbar); //add three tbar } } 可以看到这里有bbar2这样就可以增加很多bar了 复制代码 代码如下: th

《.NET 2.0面向对象编程揭秘》作者—金旭亮与您探讨.NET软件开发实践经验

问题描述 10月26日,CSDN将举办第二次SD俱乐部活动,活动邀请到拥有十多年的软件开发实践经验的北京理工大学计算机系教师--金旭亮,他将结合自己多年来的软件开发实践经验,现场编程展示实际软件开发过程,点出技术关键,并加以适当的扩充与引申,帮助程序员们加深对复杂编程技术的理解与把握,增强开发能力.[讲座主要内容]:[限制50人]第一部分从理论到实践(OOD,OOP,OOT的实例):这部分以一个支持括号与运算符优先级的四则运算器为实例,先在理论上设计出可行的计算机算法,紧接着将数据结构与算法转化

安卓简单app开发实践,代码完成后没报错,但功能就是无法使用,学生菜鸟,求指导

问题描述 安卓简单app开发实践,代码完成后没报错,但功能就是无法使用,学生菜鸟,求指导 想把网上一个简单记事本的功能(编辑,保存,修改,删除)添加入一个含三个Fragment的app框架中,但添加并把提示的错误修改后发现功能根本不管用,图标都不能点击,运行结果中console显示[2015-07-14 22:44:42 - ddms] Can't bind to local 8700 for debugger. 解决方案 看下防火墙和杀毒软件设置,提示是端口没法绑定. 解决方案二: 直接使用真

连载:面向对象葵花宝典:思想、技巧与实践(14) - 面向对象开发技术流程

抛开项目流程,让我们来谈谈"技术流程"吧!! 谈到流程,很多人立刻就会想到熟悉的瀑布模型.螺旋模型.迭代开发.敏捷.RUP等一堆软件工程相关的软件开发流程,但对于大部分人来说,这些流程仅仅是项目管理上的概念,只有项目经理开例会时那红红绿绿的甘特图.燃尽图.路径图等,或者只有评估工作量和是否要加班的时候,我们才会意识到这些流程的存在.   通俗的讲,项目管理上的流程主要是用于指导项目经理如何管理项目用的,但对于如何指导开发人员如何开发项目,并无多大用处.一个典型的情况就是刚毕业的大学生,

《面向对象设计实践指南:Ruby语言描述》目录—导读

内容提要 面向对象设计实践指南:Ruby语言描述 本书是对"如何编写更易维护.更易管理.更讨人喜爱且功能更为强大的Ruby应用程序"的全面指导.为帮助读者解决Ruby代码难以更改和不易扩展的问题,作者在书中运用了多种功能强大和实用的面向对象设计技术,并借助大量简单实用的Ruby示例对这些技术进行全面解释. 全书共9章,主要包含的内容有:如何使用面向对象编程技术编写更易于维护和扩展的Ruby代码,单个Ruby类所应包含的内容,避免将应该保持独立的对象交织在一起,在多个对象之间定义灵活的接

《面向对象设计实践指南:Ruby语言描述》—第1章 1.3节设计行为

1.3 设计行为 面向对象设计实践指南:Ruby语言描述 随着常见设计原则和模式的出现与传播,所有的OOD问题可能都已被解决.既然基础的规则都已知道,那么设计面向对象的软件还会有多难呢? 事实证明,它非常难.如果将软件理解为可定制的家具,那么原则和模式便像是木工的工具.了解软件在完成后会是什么样子,并不能让它自我构建成那个样子.应用程序之所以存在,是因为有程序员使用了这些工具.最终的结果可能是,它要么成为一个漂亮的橱柜,要么成为一张摇摇晃晃的椅子.具体是哪一种结果,则取决于程序员使用设计工具的经

Python之IPython开发实践

Python之IPython开发实践 1. IPython有行号. 2. Tab键自动完成,当前命名空间任何与已输入字符串相匹配的变量就会被找出来. 3. 内省机制,在变量前或者后面加上(?)问号,就可以将该对象的一些通用信息显示出来.(??)两个问号显示源码. 4. (一个下划线)和_(两个下划线)分别表示最近两个输出结果. 5. 与操作系统交互.可以执行shell命令,如更改目录.将命令的执行结果保存在Python对象总等. 6. 在IPython(!)感叹号开头的命令行表示其后面的所有内容