`
yesjavame
  • 浏览: 687777 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

Ext2.0 form使用实例

阅读更多

Ext2.0form不单增加了时间输入控件、隐藏输入控件,还修改了创建方法,通过formpanel代替了原来formcolumn也根据新的布局定义更新了定义方式。总体来说,定义一个form更简单便捷了。本文将通过一个实例介绍一下2.0form的创建以及其大部分控件的使用方法,因水平有限,错漏难免,忘大家多多谅解!

我们先来看看我们将要设计的form的情况:

<!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600"
   o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f"
   stroked="f">
   <v:stroke joinstyle="miter" />
   <v:formulas>
    <v:f eqn="if lineDrawn pixelLineWidth 0" />
    <v:f eqn="sum @0 1 0" />
    <v:f eqn="sum 0 0 @1" />
    <v:f eqn="prod @2 1 2" />
    <v:f eqn="prod @3 21600 pixelWidth" />
    <v:f eqn="prod @3 21600 pixelHeight" />
    <v:f eqn="sum @0 0 1" />
    <v:f eqn="prod @6 1 2" />
    <v:f eqn="prod @7 21600 pixelWidth" />
    <v:f eqn="sum @8 21600 0" />
    <v:f eqn="prod @7 21600 pixelHeight" />
    <v:f eqn="sum @10 21600 0" />
   </v:formulas>
   <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" />
   <o:lock v:ext="edit" aspectratio="t" />
  </v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" style='width:414.75pt;
   height:292.5pt'>
   <v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\04\clip_image001.jpg"
    o:title="form-1" />
  </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->

呵呵,form有点杂乱,不过在这个fomr里包含了绝大部分Ext2.0的控件,我将会和大家一起探讨一下这些控件的使用。

在创建一个form之前,我们先增加以下语句:

Ext.QuickTips.init();

Ext.form.Field.prototype.msgTarget = 'side';

第一句的目的是为需要的元件提供提示信息功能,form的主要提示信息就是客户端验证的错误信息了。

第二句的目的就是设置控件的错误信息显示位置,主要可选的位置有:

位置值

描述

qtip

当鼠标移动到控件上面时显示提示

title

在浏览器的标题显示,但是测试结果是和qtip一样的

under

在控件的底下显示错误提示

side

在控件右边显示一个错误图标,鼠标指向图标时显示错误提示

[element id]

错误提示显示在指定idHTML元件中

这个大家可以根据各人喜好设置,我习惯使用“side”,这里有一点要注意的,就是注意控制控件的宽度,以防不够宽度显示错误图标,这个下面会说到。

好了,现在创建我们的form2.0的方法就是直接创建一个formpanel

var simpleForm = new Ext.FormPanel({

labelAlign: 'left',

title: '表单例子',

buttonAlign:'right',

bodyStyle:'padding:5px',

width: 600,

frame:true,

labelWidth:80,

items: [],

buttons: []

});

simpleForm.render(document.body);

formpanle里,我们定义了form控件的标题是在左边的(labelAlign: 'left');form的标题栏显示标题“表单的例子”;它的按钮位置是在右对齐的(buttonAlign:'right');边的类型设置了内补丁5pxbodyStyle:'padding:5px');总宽度是600px;设置了面板的边角是圆弧过度的(frame:true),我设置这个属性主要目的不是因为边角,而是因为背景,如果不设置这个,背景颜色将为白色,设置了这个将会加入海蓝色的背景图,好看点;还设置了form控件的标题宽度是80pxlabelWidth:80)。还有一些其它的设置选项,我这里就不多说,大家可以参看2.0API

items数组的设置是我们的重点了,form上的所有控件都是在这里设置的。

form的结构图中看到,form整体上是分了两列的(实际上不是的,呵呵)。因为要分列,所以要使用columnLayout类。在使用columnLayout类之前,我们需要了解一下CSSfloat属性的作用,改属性主要作用是设置对象是否及如何浮动,属性值为noneleftright三个。column设置是left,意思就是对象浮在左边的。那这个有什么作用呢?其实这个和我们在word中输入文字,默认文字是左对齐的,当一行文字的宽度超过页面的宽度时将自动换行是一样的。 我们通过一个例子来说明一下。

首先我们定义一个div,背景色是黑色,宽度和高度都是200

<div style='background:black;width:200px;height:200px;'>

</div>

然后在里面加入2div,每个宽度和高度都是200,背景色一个是红色,一个是绿色:

<div style='background:black;width:200px;height:200px;'>

<div style='background:red;width:50px;height:50px;'></div>

<div style='background:green;width:50px;height:50px;'></div>

</div>

我们来看看效果:

<!--[if gte vml 1]><v:shape id="_x0000_i1026" type="#_x0000_t75"
   style='width:209.25pt;height:210.75pt'>
   <v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\04\clip_image003.jpg"
    o:title="form-2" />
  </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->

在没有使用float之前,两个子div是分别各占一行的。好,现在我们在两个子div中加入“float:left”在看看效果:

<div style='background:black;width:200px;height:200px;'>

<div style='background:red;width:50px;height:50px;float:left;'></div>

<div style='background:green;width:50px;height:50px;float:left;'></div>

</div>

<!--[if gte vml 1]><v:shape id="_x0000_i1027" type="#_x0000_t75"
   style='width:212.25pt;height:207.75pt'>
   <v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\04\clip_image005.jpg"
    o:title="form-3" />
  </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->

两个子div出现在同一行了。我们复制一下两个子div,粘贴两次,然后看看效果:

<div style='background:black;width:200px;height:200px;'>

<div style='background:red;width:50px;height:50px;float:left;'></div>

<div style='background:green;width:50px;height:50px;float:left;'></div>

<div style='background:red;width:50px;height:50px;float:left;'></div>

<div style='background:green;width:50px;height:50px;float:left;'></div>

<div style='background:red;width:50px;height:50px;float:left;'></div>

<div style='background:green;width:50px;height:50px;float:left;'></div>

</div>

<!--[if gte vml 1]><v:shape id="_x0000_i1028" type="#_x0000_t75"
   style='width:209.25pt;height:209.25pt'>
   <v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\04\clip_image007.jpg"
    o:title="form-4" />
  </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->

6个子div有序的按左对齐方式排列在一起了,当一行的子div的宽度超过了父div的宽度时,子div自动换行到了第二行。

不知道大家是否看得明白?看不明白自己再动手改变一下子div的宽度和高度,看看效果。column的工作方式就是这样的。明白这个很重要,因为在定义checkboxradio的时候,如果想它们的选项在同一行,就要注意column的宽度,不然就无法让他们在同一行。不过现在column是通过百分比来定义宽度的,我们只要控制好百分比就行了。

好了,我们继续写form,因为要用到column,所以我们先在formpanelitmes加入一个column的定义:

{

layout:'column',

border:false,

labelSeparator:'',

items:[]

}

代码里定义了在这里使用的是columnlayoutlayout:'column');没有边(border:false);标题的分隔符号我们用中文冒号代替英文的冒号(labelSeparator:'')。coulmnLayout里的控件将定义在items里。

我们首先在items里加入一个常用输入控件,是用来输入姓名的:

{

columnWidth:.5,

layout: 'form',

border:false,

items: [{

xtype:'textfield',

fieldLabel: '姓名',

name: 'name',

anchor:'90%'

}]

}

我们设置了该列的宽度占总宽度的50%columnWidth:.5);在布局里放了一个formlayout用来放置控件(layout: 'form');formlayout也是没有边的(border:false)。在formlayout里有一个类型为textfield'xtype:'textfield')的输入控件。控件标题为姓名(fieldLabel: '姓名'),输入框(input)的name属性设置“name”(name: 'name'),输入框的长度为列宽减去标题的宽度后的90%anchor:'90%'),余下的10%的是给显示错误信息图标用的。

在加入性别的radio控件时就要注意了,这里需要加入两个radio,第一radio是有标题的,第二是没有的,而且两个radio加起来的宽度应该正好是余下的列宽(50%):

{

columnWidth:.25,

layout: 'form',

border:false,

items: [{

style:'margin-top:5px',

xtype:'radio',

fieldLabel: '性别',

boxLabel:'',

name: 'sex',

checked:true,

inputValue:'',

anchor:'95%'

}]

},{

columnWidth:.25,

layout: 'form',

labelWidth:0,

labelSeparator:'',

hideLabels:true,

border:false,

items: [{

style:'margin-top:5px',

xtype:'radio',

fieldLabel: '',

boxLabel:'',

name: 'sex',

inputValue:'',

anchor:'95%'

}]

}

从代码中可以看到,除了列宽设置为25%外,其它的列设置和第一控件是一样。Formlayout里加入了一个类型为radio的控件。控件的标题是性别,控件的选择显示文本是男(boxLabel:'男),inputname属性值是sexname: 'sex'),该控件默认是已选的(checked:true),控件的值(value)是男(inputValue:''),input的宽度是95%。在这里我还设置一个css属性,顶部的外补丁为5pxstyle:'margin-top:5px'),原因是为了选择按钮和标题对齐,大家可以将该属性去掉然后看看效果。

第二个raido控件的列设置就有所不同,因为它不需要标题,所以要设置隐藏标题(hideLabels:true),标题的宽度设置为0labelWidth:0,还要设置其标题分隔符号为空(labelSeparator:'')。其余的设置和第一个radio的设置没有不同,只是input的值不同了。

我们已经设置了3列,3列的列宽分别为50%25%25%,根据float的原则,下一列将从第二行开始。

在第二行第一列我们要增加的是一个日期选择控件:

{

columnWidth:.5,

layout: 'form',

border:false,

items: [{

xtype:'datefield',

fieldLabel: '出生日期',

name: 'birthday',

anchor:'90%'

}]

}

日期控件的列宽也是50%,列的其它设置没有变化。控件的类型为datefield,标题是出生日期,inputname属性是birthdayintput宽度也是设置了90%,出来留出空位给错误信息外,还可以让控件与上一行的姓名的宽度相同,整列看起来比较整齐。

日期控件的设置和普通文本输入的设置一样简单,这里就不多说了。不过要说到的是汉化的问题。在2.0版自带的本地化文件ext-lang-zh.js中存在一些小bug,我们需要自己修改一下。

首先要修改的是周的显示,原来的定义是:

Date.dayNames = [

"周日",

"周一",

"周二",

"周三",

"周四",

"周五",

"周六"

];

因为在日期选择中显示的区域不够宽,只能显示一个汉字,所以需要将上面定义的把“周”去掉,修改为:

Date.dayNames = [

"",

"",

"",

"",

"",

"",

""

];

在年份和月份选择中的按钮文字还是英文“ok”和“cancel”的,这里我们也需要修改一下:

if(Ext.DatePicker){

Ext.apply(Ext.DatePicker.prototype, {

todayText : "今天",

minText : "日期在最小日期之前",

maxText : "日期在最大日期之后",

disabledDaysText : "",

disabledDatesText : "",

monthNames : Date.monthNames,

dayNames : Date.dayNames,

nextText : '下月 (Control+Right)',

prevText : '上月 (Control+Left)',

monthYearText : '选择一个月 (Control+Up/Down 来改变年)',

todayTip : "{0} (Spacebar)",

okText : "确定",

cancelText : "取消",

format : "ymd"

});

}

上面定义中黑色字体部分就是要加入的代码。如果不喜欢默认格式是“ymd日”,需要修改:

if(Ext.form.DateField){

Ext.apply(Ext.form.DateField.prototype, {

disabledDaysText : "禁用",

disabledDatesText : "禁用",

minText : "该输入项的日期必须在 {0} 之后",

maxText : "该输入项的日期必须在 {0} 之前",

invalidText : "{0} 是无效的日期 - 必须符合格式: {1}",

format : "Y-m-d"

});

}

修改DatePicker不会改变DateField的格式的,这个自己根据情况决定,呵呵。

我们继续,现在需要加入一个学历的下拉选择控件。下来选择控件最重要的一个定义就是数据的定义的,数据定义错误,可能得不到我们需要的效果,也是很多朋友感觉最麻烦的地方。

{

columnWidth:.5,

layout: 'form',

border:false,

items: [{

xtype:'combo',

store: new Ext.data.SimpleStore(

{

fields: ["retrunValue", "displayText"],

data: [[1,'小学'],[2,'初中'],[3,'高中'],[4,'中专'],[5,'大专'],[6,'大学']]

}),

valueField :"retrunValue",

displayField: "displayText",

mode: 'local',

forceSelection: true,

blankText:'请选择学历',

emptyText:'选择学历',

hiddenName:'education',

editable: false,

triggerAction: 'all',

allowBlank:false,

fieldLabel: '学历',

name: 'education',

anchor:'90%'

}]

}

列的定义就不说了,没变化。在items里,类型设置成combo了,在这里定义了一个sotre属性,就是选择值存储的地方,因为是在客户端的数据,所以使用了一个简单存储(SimpleStore)。在存储里,我们通过一个数组定义了retrunValuedisplayText两个字段。retrunValue字段指定是提交给后台的值,displayText字段指定是在下拉中显示的选择值。然后我们在data里定义了几组数据(data: [[1,'小学'],[2,'初中'],[3,'高中'],[4,'中专'],[5,'大专'],[3,'大学']]),我们可以看到,每组数据都是根据fiedls的定义来组成的,数组里第一个值就是retrunValue的值,第二个值就是displayText的值,例如[1,'小学'],就表示retrunValue1displayText是小学。

下面就是很重要的一步了,设置下拉选择框的值和显示文本。本例中设置了下拉选择框的提交值对象的是存储中的retrunValue字段(valueField :"retrunValue"),显示文本是存储中的displayText字段(displayField: "displayText"),通过这两个设置就可将存储中的数据和下拉框对应起来。

因为数据是在本地,所以设置了模式为localmode: 'local')。该下拉列表只允许选择,不允许输入(editable: false),而且是必须选择一个选项(forceSelection: true)。在没有选择值时显示为选择学历(emptyText:'选择学历')。提交form时,该项如果没有选择,则提示错误信息“请选择学历”(blankText:'请选择学历')。该选项值不允许为空(allowBlank:false)。大家要注意的是hiddenNamename属性,name只是改下拉的名称,作用是可通过,而hiddenName才是提交到后台的inputname。如果没有设置hiddenName,在后台是接收不到结构的,这个大家一定要注意。

因为这个下拉是只能选择的,所以一定要设置属性triggerActionall,不然当你选择了某个选项后,你的下拉将只会出现匹配选项值文本的选择项,其它选择项是不会再显示了,这样你就不能更改其它选项了。

如果要为控件设置默认值,就设置属性valuevalue的值要设置为提交给后台的值,不要设置为显示文本。例如本例要设置大学为默认值得,则设置value的值为6

现在到第三行了,我们要创建一个checkbox选项输入:

{

columnWidth:.35,

layout: 'form',

border:false,

items: [{

xtype:'checkbox',

fieldLabel: '权限组',

boxLabel:'系统管理员',

name: 'popedom',

inputValue:'1',

anchor:'95%'

}]

},{

columnWidth:.2,

layout: 'form',

labelWidth:0,

labelSeparator:'',

hideLabels:true,

border:false,

items: [{

xtype:'checkbox',

fieldLabel: '',

boxLabel:'管理员',

name: 'pepedom',

inputValue:'2',

anchor:'95%'

}]

},{

columnWidth:.2,

layout: 'form',

labelWidth:0,

labelSeparator:'',

hideLabels:true,

border:false,

items: [{

xtype:'checkbox',

fieldLabel: '',

boxLabel:'普通用户',

name: 'pepedom',

inputValue:'3',

anchor:'95%'

}]

},{

columnWidth:.25,

layout: 'form',

labelWidth:0,

labelSeparator:'',

hideLabels:true,

border:false,

items: [{

xtype:'checkbox',

fieldLabel: '',

boxLabel:'访客',

name: 'pepedom',

inputValue:'4',

anchor:'95%'

}]

}

checkbox的设置和radio的设置大同小异,大家注意列宽的定义就行。

第四行的两个输入框主要是测试通过vtypes属性来验证输入框的输入的:

<sp

分享到:
评论

相关推荐

    Ext2.0 form使用实例的例程

    在这个“Ext2.0 form使用实例的例程”中,我们将深入探讨Ext 2.0的表单(form)组件及其应用。 表单在任何应用程序中都扮演着至关重要的角色,用于收集和验证用户输入的数据。Ext 2.0的表单组件提供了一整套完整的...

    ext 2.0 form demo

    这个演示可能包括了各种表单元素的实例,如文本输入、选择框、日期选择器等,展示了EXT 2.0的灵活性和易用性。 总结,EXT 2.0 Form Demo是一个学习EXT如何构建高效、交互性好、功能强大的表单的好资源。通过深入...

    EXT2.0 GRID 示例

    EXT2.0 GRID 示例是一个基于EXT JavaScript库的高级数据展示和操作组件的实例。EXT是一个强大的前端开发框架,尤其在创建交互式Web应用程序方面表现出色。EXT2.0是EXT库的一个早期版本,它提供了丰富的用户界面组件...

    ext2.0中文帮助文档

    3. **强大的布局系统**:EXT2.0拥有多种布局管理器,如fit布局、border布局、form布局等,可以灵活地调整组件的大小和位置,适应不同屏幕尺寸和设备。 4. **Ajax支持**:EXT2.0提供了一套完整的Ajax解决方案,包括...

    ext 2.0

    1. **布局管理器**:EXT 2.0 提供了多种布局模式,如“Fit”布局、“Border”布局、“Form”布局等,使得开发者能够轻松地调整组件在容器中的位置和大小。 2. **数据绑定**:EXT 2.0 引入了强大的数据绑定机制,...

    ext2.0入门教程

    3. **布局管理**:EXT2.0有多种内置的布局方式,如Fit、Border、Table、Form等,用于管理组件在容器中的排列和大小调整,使得你可以灵活地设计界面布局。 4. **数据绑定**:EXT2.0支持数据绑定,能够将UI组件与数据...

    《Ext 2.0 核心API 详解教程》 pdf

    5. **布局(Layouts)**:EXT 2.0支持多种布局模式,如表格布局(Table Layout)、绝对布局(Absolute Layout)、流式布局(Form Layout)等,使得组件能够在容器中灵活排列和调整大小。 6. **组件(Components)**...

    ext2.0(dateTimeField)

    在实际应用中,使用`ext2.0 dateTimeField`时,开发者需要确保正确引用了这些资源文件,并在代码中实例化`dateTimeField`组件。通常会涉及到以下步骤: 1. 引入`ext2.0`的库文件,如`ext-all.js`,以及上述提到的`...

    GWT-EXT2.0最佳实践教程,源代码打包供下载

    《GWT-EXT2.0最佳实践教程》源代码打包下载资源主要涵盖了Google Web Toolkit (GWT) 和EXT-JS 2.0的结合使用,提供了丰富的实践案例和示例代码,旨在帮助开发者深入理解和应用这两项技术。GWT是一款强大的JavaScript...

    ext2.0 DateTimeField控件

    2. 创建DateTimeField实例:通过EXT JS的构造函数创建一个DateTimeField对象,例如: ```javascript var dateTimeField = new Ext.form.DateTimeField({ fieldLabel: '选择日期时间', format: 'Y-m-d H:i:s' // ...

    EXT教程EXT用大量的实例演示Ext实例

    Ext教程为使用Ext JS框架的开发者提供了大量实例和详细的说明,涵盖了从基本入门到进阶使用,再到解决遇到的问题,是一份非常实用的参考资料。通过这些实例,开发者可以快速掌握Ext JS的使用,并能高效地应用于实际...

    ext 实例

    在本实例中,我们将探讨EXT 2.0技术如何应用于创建一个JSP留言板。 EXT的核心在于其组件模型,它包括了各种UI元素,如表格、树形视图、按钮、面板等。在JSP留言板应用中,EXT可能被用来构建以下几个关键部分: 1. ...

    struts2.0上传下载实例

    本实例重点讲解Struts2.0中的文件上传和下载功能,这对于任何处理用户数据交互的Web应用都是必不可少的特性。 在Struts2中,文件上传是通过`struts2-core.jar`、`commons-fileupload.jar`和`commons-io.jar`等库来...

    Ext中文手册+2.0实例

    本资料包包含"Ext中文手册"和"ExtJS 2.0实用简明教程",将帮助你深入理解和熟练运用ExtJS。 **Ext中文手册**: 该手册是ExtJS的中文版文档,全面覆盖了ExtJS的各种组件、类库、事件和方法。手册中详细解释了如何...

    ExtGrid使用

    Ext2.0是其较早的一个版本,包含许多基础和高级组件,如Grid、Tree、Form等。 2. **ExtGrid**:ExtGrid是Ext JS中的表格组件,用于显示结构化的数据。它支持多种功能,如排序、过滤、分页、行编辑等。在本例中,...

    Ext js 资源大全

    "ext2.0官方文档 .rar"则是Ext JS 2.0版本的官方文档,它详细阐述了该版本的主要特性和功能。尽管可能有些过时,但对于理解Ext JS的历史和演变,以及对比不同版本之间的差异,仍然具有参考价值。官方文档通常是最...

    Extjs2.0 智能提示

    这个版本引入了许多预定义的组件类,如Ext.Panel、Ext.Window、Ext.form.FormPanel等。每个类都有自己的属性、方法和事件。智能提示在此起到了重要作用,它允许开发者在创建对象实例或调用方法时,快速了解类的结构...

    Ext + Gwt + Struts2.0开发5

    总结来说,"Ext + GWT + Struts2.0"的开发模式允许你利用ExtJS的强大UI组件库,GWT的远程服务调用机制,以及Struts2.0的MVC架构,创建一个完整的、高性能的Web应用。这种组合提供了从用户交互、数据处理到服务器端...

Global site tag (gtag.js) - Google Analytics