这是自己在学习Ext过程中一个写的一个示例程序,仅为练习,功能并不全,现将其记录在我的博客中,希望可以和学习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=newInsertPersonInfoWindow();
- this.insertWin.on("submit",this.onInsertWinSubmit,this);
- this.updateWin=newUpdatePersonInfoWindow();
- this.updateWin.on("submit",this.onUpdateWinSubmit,this);
- PersonListGridPanel.superclass.constructor.call(this,{
- renderTo:Ext.getBody(),
- width:360,
- height:300,
- frame:true,
- sm:newExt.grid.RowSelectionModel({
- singleSelect:true,
- listeners:{
- "rowselect":{
- fn:function(sm,rowIndex,r){
- this.fireEvent("rowSelect",r);//触发自定义事件
- },
- scope:this
- }
- }
- }),
- store:newExt.data.JsonStore({
- data:[{name:"李宗盛",age:28,sex:"男"},{name:"林忆莲",age:26,sex:"女"}],
- fields:["name","sex","age"]
- }),
- draggable:false,
- enableColumnMove:false,
- title:"FirstGrid",
- //iconCls:'icon-grid',
- colModel:newExt.grid.ColumnModel([
- {header:"StaffName",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=newInsertPersonInfoWindow();
- //}
- //this.insertWin.show();
- //***************************************************
- this.insertWin.show();
- },
- scope:this
- },"-",{
- text:"修改人员",
- handler:function(){
- varr=this.getActiveRecord();
- if(!r)return;
- //一定要先调用Show方法,而后再调用Load方法,
- //否则数据不会被呈现出来
- this.updateWin.show();
- this.updateWin.load(r);
- },
- scope:this
- },"-",{
- text:"删除人员",
- handler:function(){
- varr=this.getActiveRecord();
- if(!r)return;
- Ext.MessageBox.confirm("删除","删除当前人员信息?",function(btn){
- if(btn=="yes"){
- this.delRecord(r);
- }
- },this);
- },
- scope:this
- }]
- });
- },
- getActiveRecord:function(){
- varsm=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:"PersonInfo",
- 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:newExt.data.SimpleStore({
- fields:[
- {name:'Sex'}
- ],
- data:[["男"],["女"]]
- }),
- mode:'local',
- displayField:'Sex',
- triggerAction:'all',
- emptyText:'选择性别...'
- }]
- })
- },
- getValues:function(){
- if(this.getForm().isValid()){
- returnnewExt.data.Record(this.getForm().getValues());
- }
- else{
- throwError("ErrorMessage");
- }
- },
- 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=newPersonInfoFormPanel();
- //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中的引用代码
- <scripttype="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))returntrue;
- }
- returnfalse;
- },
- "ageText":"年龄必须在0到200之间",
- "ageMask":/[0-9]/i
- });
- Ext.onReady(function(){
- newPersonListGridPanel();
- });
- </script>
代码很简洁,也很清晰。只需要创建一个PersonListGridPanel即可,因为它自身包含了新增、修改的窗体对象,而新增和修改窗体中都使用到了负责数据编辑的PersonInfoFormPanel。
在PersonInfoFormPanel中使用了VTypes进行数据验证。
新增和修改窗体仅仅是界面,负责将用户在PersonInfoFormPanel中填写的数据传回到ListGrid中以便保存,或是将ListGrid中的数据传递到PersonInfoFormPanel中进行呈现,供用户编辑。
附上完整的HTML代码和JavaScript代码文件。
Grid.html
- <html>
- <head>
- <title>ExtGrid</title>
- <linkrel="stylesheet"type="text/css"href="http://localhost:8080/ext-2.2/resources/css/ext-all.css"/>
- <scripttype="text/javascript"src="http://localhost:8080/ext-2.2/adapter/ext/ext-base.js"></script>
- <scripttype="text/javascript"src="http://localhost:8080/ext-2.2/ext-all.js"></script>
- <scripttype="text/javascript"src="PersonListGridPanel.js"></script>
- <scripttype="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))returntrue;
- }
- returnfalse;
- },
- "ageText":"年龄必须在0到200之间",
- "ageMask":/[0-9]/i
- });
- Ext.onReady(function(){
- newPersonListGridPanel();
- });
- </script>
- </head>
- <body>
- </body>
- </html>
PersonListGridPanel.js
- //定义数据列表面板类
- PersonListGridPanel=Ext.extend(Ext.grid.GridPanel,{
- insertWin:null,
- updateWin:null,
- constructor:function(){
- //添加自定义事件
- this.addEvents("rowSelect");
- this.insertWin=newInsertPersonInfoWindow();
- this.insertWin.on("submit",this.onInsertWinSubmit,this);
- this.updateWin=newUpdatePersonInfoWindow();
- this.updateWin.on("submit",this.onUpdateWinSubmit,this);
- PersonListGridPanel.superclass.constructor.call(this,{
- renderTo:Ext.getBody(),
- width:360,
- height:300,
- frame:true,
- sm:newExt.grid.RowSelectionModel({
- singleSelect:true,
- listeners:{
- "rowselect":{
- fn:function(sm,rowIndex,r){
- this.fireEvent("rowSelect",r);//触发自定义事件
- },
- scope:this
- }
- }
- }),
- store:newExt.data.JsonStore({
- data:[{name:"李宗盛",age:28,sex:"男"},{name:"林忆莲",age:26,sex:"女"}],
- fields:["name","sex","age"]
- }),
- draggable:false,
- enableColumnMove:false,
- title:"FirstGrid",
- //iconCls:'icon-grid',
- colModel:newExt.grid.ColumnModel([
- {header:"StaffName",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:[{
- name:"btnFirst",
- //text:"First",
- iconCls:"x-tbar-page-first",
- handler:function(){
- this.getSelectionModel().selectFirstRow();
- },
- scope:this
- },{
- name:"btnPrev",
- //text:"Prev",
- iconCls:"x-tbar-page-prev",
- handler:function(){
- this.getSelectionModel().selectPrevious();
- },
- scope:this
- },{
- name:"btnNext",
- //text:"Next",
- iconCls:"x-tbar-page-next",
- handler:function(){
- this.getSelectionModel().selectNext();
- },
- scope:this
- },{
- name:"btnLast",
- //text:"Last",
- iconCls:"x-tbar-page-last",
- handler:function(){
- this.getSelectionModel().selectLastRow();
- },
- scope:this
- },"-",{
- text:"添加",
- handler:function(){
- //***************************************************
- //如果没有重写InsertPersonInfoWindow的Close方法
- //在调用之前需要检查其实例insertWin是否被释放
- //使用示例:
- //if(!this.insertWin){
- //this.insertWin=newInsertPersonInfoWindow();
- //}
- //this.insertWin.show();
- //***************************************************
- this.insertWin.show();
- },
- scope:this
- },"-",{
- text:"修改",
- handler:function(){
- varr=this.getActiveRecord();
- if(!r)return;
- //如何将数据填充到窗体中?
- this.updateWin.show();
- this.updateWin.load(r);
- },
- scope:this
- },"-",{
- text:"删除",
- handler:function(){
- varr=this.getActiveRecord();
- if(!r)return;
- Ext.MessageBox.confirm("删除","删除当前人员信息?",function(btn){
- if(btn=="yes"){
- this.delRecord(r);
- }
- },this);
- },
- scope:this
- }]
- });
- },
- getActiveRecord:function(){
- varsm=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:"PersonInfo",
- 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:newExt.data.SimpleStore({
- fields:[
- {name:'Sex'}
- ],
- data:[["男"],["女"]]
- }),
- mode:'local',
- displayField:'Sex',
- triggerAction:'all',
- emptyText:'选择性别...'
- }]
- })
- },
- getValues:function(){
- if(this.getForm().isValid()){
- returnnewExt.data.Record(this.getForm().getValues());
- }
- else{
- throwError("信息不完整");
- }
- },
- setValues:function(r){
- //alert(Ext.util.JSON.encode(r.data));
- this.getForm().loadRecord(r);
- },
- reset:function(){
- this.getForm().reset();
- }
- });
- //==============================================================================
- //新增,修改窗体基类
- PersonInfoWindow=Ext.extend(Ext.Window,{
- form:null,
- constructor:function(){
- this.addEvents("submit");
- this.form=newPersonInfoFormPanel();
- //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);
- }
- });
版权声明:本文为博主原创文章,未经博主允许不得转载。
相关推荐
总结一下,这个示例展示了以下ExtJS面向对象开发的关键点: 1. **继承与扩展**:`PersonListGridPanel` 类继承自 `Ext.grid.GridPanel`,增加了自己的特性。 2. **组件组合**:使用了GridPanel、FormPanel和Window...
在《Ext面向对象开发实践》的后续部分,我们将深入探讨如何实现数据表的CRUD(Create, Read, Update, Delete)操作,确保用户在刷新页面后仍能保留他们的操作。 首先,为了从服务器获取并展示数据,我们需要创建一...
Ext JS Web开发技术详解》首先对Ext JS进行了概述,然后通过一个简单的示例带领读者快速入门,在读者对Ext JS有了初步印象后,又重点介绍了JavaScript的面向对象技术、Ext JS API文档的使用方法、Ext JS的开发流程,...
Ext是一个强大的JavaScript库,专为构建富客户端Ajax应用程序而设计。它以其面向对象的编程模型、丰富的用户界面组件和...对于有面向对象基础的开发者,Ext提供的面向对象编程模型将进一步增强他们开发Web应用的能力。
EXT JS采用了面向对象的编程模式,支持类的继承和重写。这允许开发者在不修改原始代码的情况下,扩展和定制现有组件的功能。 **十八、补充资料与概述** 除了上述内容,EXT JS还提供了丰富的文档和社区资源,包括...
Ext JS Web开发技术详解》首先对Ext JS进行了概述,然后通过一个简单的示例带领读者快速入门,在读者对Ext JS有了初步印象后,又重点介绍了JavaScript的面向对象技术、Ext JS API文档的使用方法、Ext JS的开发流程,...
Ext JS Web开发技术详解》首先对Ext JS进行了概述,然后通过一个简单的示例带领读者快速入门,在读者对Ext JS有了初步印象后,又重点介绍了JavaScript的面向对象技术、Ext JS API文档的使用方法、Ext JS的开发流程,...
Ext JS Web开发技术详解》首先对Ext JS进行了概述,然后通过一个简单的示例带领读者快速入门,在读者对Ext JS有了初步印象后,又重点介绍了JavaScript的面向对象技术、Ext JS API文档的使用方法、Ext JS的开发流程,...
EXT基于JavaScript,所以理解JavaScript语法和面向对象编程概念是非常必要的。开发者可能会学到如何创建EXT组件、布局管理、事件处理等。 总的来说,这个“ext/ajax开发资料”应包含EXT库的Ajax使用方法,以及可能...
通过学习和实践这些样本,开发者可以深入理解ExtJS的面向对象设计,提升代码的可维护性和可扩展性,同时也能更好地适应大型项目的需求。在实际开发中,合理地运用面向对象设计,可以提高代码的组织结构,降低代码...
2. **类系统**:EXT使用面向对象的编程方式,"ext-base.js"中包含了类的创建、继承和实例化等机制,使得开发者可以方便地创建自定义组件。 3. **事件系统**:EXT的事件模型是其交互性的重要组成部分,"ext-base.js...
#### 二、面向对象的固态硬盘设计实践 **1. SSD面临的挑战** 传统的存储堆栈针对的是磁盘驱动器,而SSD则具有完全不同的内部结构和特性。例如,SSD的随机写入速度远低于顺序写入速度,并且存在写入放大、磨损均衡...
JavaScript是EXT JS的基石,因此掌握JavaScript的基本语法和面向对象编程是使用EXT的前提。EXT JS 1.1虽然较为古老,但仍然包含了许多现代前端开发的理念,如MVC(Model-View-Controller)架构,这种架构模式有助于...
开发者应该熟悉JavaScript的面向对象特性、事件处理、DOM操作等,这样才能更好地利用EXT3.0构建动态、交互性强的Web应用。 综上所述,《ext3.0开发之-->葵花宝典》是一个全面的EXT3.0学习资源,无论你是初学者还是...
GWT的主要优势在于它的强类型、面向对象的编程模型,以及对Java开发工具的全面支持,如Eclipse IDE。 EXT GWT(GXT)是EXT JS的GWT版本,它扩展了GWT的功能,提供了大量的UI组件,如表格、树形视图、图表等,这些...
在JavaScript这种没有类的语言中,`Ext.extend()` 提供了面向对象编程的模拟。当我们想要自定义一个新类,并希望它继承自另一个已有类时,可以使用这个方法。以下是一个基本的使用示例: ```javascript Ext.extend...
Ext JS通过扩展JavaScript,提供了面向对象的编程方式,增强了其在构建复杂应用中的能力。 “web”标签表明,Ext JS主要用于Web应用的开发。它利用Ajax技术进行异步通信,实现页面的无刷新更新,极大地提升了用户...