Ext2.0的form不单增加了时间输入控件、隐藏输入控件,还修改了创建方法,通过formpanel代替了原来form,column也根据新的布局定义更新了定义方式。总体来说,定义一个form更简单便捷了。本文将通过一个实例介绍一下2.0的form的创建以及其大部分控件的使用方法,因水平有限,错漏难免,忘大家多多谅解!
- Ext.QuickTips.init();
- Ext.form.Field.prototype.msgTarget = 'side';
第一句的目的是为需要的元件提供提示信息功能,form的主要提示信息就是客户端验证的错误信息了。
- 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);
- <div style='background:black;width:200px;height:200px;'>
- </div>
然后在里面加入2个div,每个宽度和高度都是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>
我们来看看效果:
在没有使用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>
两个子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>
- {
- layout:'column',
- border:false,
- labelSeparator:':',
- items:[]
- }
- {
- columnWidth:.5,
- layout: 'form',
- border:false,
- items: [{
- xtype:'textfield',
- fieldLabel: '姓名',
- name: 'name',
- anchor:'90%'
- }]
- }
- {
- 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%'
- }]
- }
- {
- columnWidth:.5,
- layout: 'form',
- border:false,
- items: [{
- xtype:'datefield',
- fieldLabel: '出生日期',
- name: 'birthday',
- anchor:'90%'
- }]
- }
日期控件的列宽也是50%,列的其它设置没有变化。控件的类型为datefield,标题是出生日期,input的name属性是birthday,intput宽度也是设置了90%,出来留出空位给错误信息外,还可以让控件与上一行的姓名的宽度相同,整列看起来比较整齐。
- 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 : "y年m月d日"
- });
- }
上面定义中黑色字体部分就是要加入的代码。如果不喜欢默认格式是“y年m月d日”,需要修改:
- 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)。在存储里,我们通过一个数组定义了retrunValue和displayText两个字段。retrunValue字段指定是提交给后台的值,displayText字段指定是在下拉中显示的选择值。然后我们在data里定义了几组数据(data: [[1,'小学'],[2,'初中'],[3,'高中'],[4,'中专'],[5,'大专'],[3,'大学']]),我们可以看到,每组数据都是根据fiedls的定义来组成的,数组里第一个值就是retrunValue的值,第二个值就是displayText的值,例如[1,'小学'],就表示retrunValue是1,displayText是小学。
- {
- 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的设置大同小异,大家注意列宽的定义就行。
- {
- columnWidth:.5,
- layout: 'form',
- border:false,
- items: [{
- xtype:'textfield',
- fieldLabel: '电子邮件',
- name: 'email',
- vtype:'email',
- allowBlank:false,
- anchor:'90%'
- }]
- },{
- columnWidth:.5,
- layout: 'form',
- border:false,
- items: [{
- xtype:'textfield',
- fieldLabel: '个人主页',
- name: 'url',
- vtype:'url',
- anchor:'90%'
- }]
- }]
- }
这里的定义和普通的文本输入框没什么区别,只是多了一个vtypes的属性定义。Vtypes里总共定义了email、url、alpha和alphanum四种类型数据格式,email和url这个不用介绍了,呵呵。alpha是字母和下划线的组合,alphanum是字母、下划线和数字的组合。
- {
- xtype:'tabpanel',
- plain:true,
- activeTab: 0,
- height:235,
- defaults:{bodyStyle:'padding:10px'},
- items:[]
- }
要注意的是,这个tabpanel不是在上面coulmn的items里加的,因为不在column里。我们加在formpanel里。把item类型设置为'tabpanel'就行了,然后将标签页头的背景设置为透明的(plain:true),当前活动的标签页是第一页(activeTab: 0),高度设置为235px(height:235),tab页的面板使用内补丁10px(defaults:{bodyStyle:'padding:10px'})。
- {
- title:'登录信息',
- layout:'form',
- defaults: {width: 230},
- defaultType: 'textfield',
- items: [{
- fieldLabel: '登录名',
- name: 'loginID',
- allowBlank:false,
- vtype:'alphanum',
- allowBlank:false
- },{
- inputType:'password',
- fieldLabel: '密码',
- name: 'password',
- allowBlank:false
- }]
- }
在标签定义了,设置了标签标题是登录信息(title:'登录信息'),控件容器是formlayout(layout:'form'),控件的默认宽度是230px(defaults: {width: 230}),默认控件类型是textfield(defaultType: 'textfield')。
- {
- title:'数字时间字母',
- layout:'form',
- defaults: {width: 230},
- defaultType: 'textfield',
- items: [{
- xtype:'numberfield',
- fieldLabel: '数字',
- name: 'number'
- },{
- xtype:'timefield',
- fieldLabel: '时间',
- name: 'time'
- },{
- fieldLabel: '纯字母',
- name: 'char',
- vtype:'alpha'
- }]
- }
Numberfield顾名思义就是只能输入数字的输入控件。在该例子,没做最大值、最小值任何限制,如果要设置最大值和最小值,分别设置maxValue和minValue两个属性就行了。如果要设置数字输入长度,例如身份证号码,可以设置maxLength和minLength两个属性。可以通过设置maxText、minText、maxLengthText和minLengthText设置各自的验证出错信息。可通过allowDecimals属性设置是否只允许输入整型值,默认值是true,允许输入浮点数。设置allowNegative设置是否只允许输入正数,默认值是true,允许输入正负数。通过decimalPrecision属性可设置小数点后的位数,默认值是2位。
- if(Ext.form.TimeField){
- Ext.apply(Ext.form.TimeField.prototype, {
- format:'G:i:s',
- minText : "该输入项的时间必须大于或等于: {0}",
- maxText : "该输入项的时间必须小于或等于: {0}",
- invalidText : "{0}不是有效的时间",
- });
- }
在这里,我默认定义了时间格式是24小时制的,小时为个位数是不加前缀0。
- {
- title:'文本区域',
- layout:'fit',
- items: {
- xtype:'textarea',
- id:'area',
- fieldLabel:''
- }
- }
和textfield一样,只要设置类型为textarea就可以了,唯一的区别是为了让textarea和面板自适应面板,使用了fitlayout作为它的容器,所以在这里我们不用设置textarea的宽度和高度。
- buttons: [{
- text: '保存',
- handler:function(){
- if(simpleForm.form.isValid()){
- this.disabled=true;
- simpleForm.form.doAction('submit',{
- url:'test.asp',
- method:'post',
- params:'',
- success:function(form,action){
- Ext.Msg.alert('操作',action.result.data); this.disabled=false;
- },
- failure:function(){
- Ext.Msg.alert('操作','保存失败!');
- this.disabled=false;
- }
- });
- }
- }
- },{
- text: '取消',
- handler:function(){simpleForm.form.reset();}
- }]
在formpanel类中,form属性指向的是formpanle里的basicform对象,我们可通过formpanle.form来使用该basicform对象。在被例子,我们已经将formpanel对象赋值给了simpleForm这个变量,所以我们可以通过simpleForm.form访问面板里的basicform对象。
- onSubmit: Ext.emptyFn, submit: function() { this.getEl().dom.submit();
- }
第一个设置的目的是取消formpanel的默认提交函数。第二就是设置新的提交方式为旧方式提交。
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
- <html>
- <head>
- <title>简单的表单例子</title>
- <meta http-equiv="content-type" content="text/html; charset=utf-8">
- <link rel="stylesheet" type="text/css" href="../../resources/css/ext-all.css">
- </head>
- <body>
- <script type="text/javascript" src=\'#\'" /../adapter/ext/ext-base.js"></script>
- <script type="text/javascript" src=\'#\'" /../ext-all.js"></script>
- <script type="text/javascript" src=\'#\'" /../ext-lang-zh_CN.js"></script>
- <script>
- Ext.QuickTips.init();
- Ext.form.Field.prototype.msgTarget = 'side';
- var simpleForm = new Ext.FormPanel({
- labelAlign: 'left',
- title: '表单例子',
- buttonAlign:'right',
- bodyStyle:'padding:5px',
- width: 600,
- frame:true,
- labelWidth:80,
- items: [{
- layout:'column',
- border:false,
- labelSeparator:':',
- items:[{
- columnWidth:.5,
- layout: 'form',
- border:false,
- items: [{
- xtype:'textfield',
- fieldLabel: '姓名',
- name: 'name',
- anchor:'90%'
- }]
- },{
- 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%'
- }]
- },{
- columnWidth:.5,
- layout: 'form',
- border:false,
- items: [{
- xtype:'datefield',
- fieldLabel: '出生日期',
- name: 'birthday',
- anchor:'90%'
- }]
- },{
- 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%'
- }]
- },{
- 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%'
- }]
- },{
- columnWidth:.5,
- layout: 'form',
- border:false,
- items: [{
- xtype:'textfield',
- fieldLabel: '电子邮件',
- name: 'email',
- vtype:'email',
- allowBlank:false,
- anchor:'90%'
- }]
- },{
- columnWidth:.5,
- layout: 'form',
- border:false,
- items: [{
- xtype:'textfield',
- fieldLabel: '个人主页',
- name: 'url',
- vtype:'url',
- anchor:'90%'
- }]
- }]
- },{
- xtype:'tabpanel',
- plain:true,
- activeTab: 0,
- height:235,
- defaults:{bodyStyle:'padding:10px'},
- items:[{
- title:'登录信息',
- layout:'form',
- defaults: {width: 230},
- defaultType: 'textfield',
- items: [{
- fieldLabel: '登录名',
- name: 'loginID',
- allowBlank:false,
- vtype:'alphanum',
- allowBlank:false
- },{
- inputType:'password',
- fieldLabel: '密码',
- name: 'password',
- allowBlank:false
- }]
- },{
- title:'数字时间字母',
- layout:'form',
- defaults: {width: 230},
- defaultType: 'textfield',
- items: [{
- xtype:'numberfield',
- fieldLabel: '数字',
- name: 'number'
- },{
- xtype:'timefield',
- fieldLabel: '时间',
- name: 'time'
- },{
- fieldLabel: '纯字母',
- name: 'char',
- vtype:'alpha'
- }]
- },{
- title:'文本区域',
- layout:'fit',
- items: {
- xtype:'textarea',
- id:'area',
- fieldLabel:''
- }
- }]
- }],
- buttons: [{
- text: '保存',
- handler:function(){
- if(simpleForm.form.isValid()){
- this.disabled=true;
- simpleForm.form.doAction('submit',{
- url:'test.asp',
- method:'post',
- params:'',
- success:function(form,action){
- Ext.Msg.alert('操作',action.result.data);
- this.disabled=false;
- },
- failure:function(){
- Ext.Msg.alert('操作','保存失败!');
- this.disabled=false;
- }
- });
- }
- }
- },{
- text: '取消',
- handler:function(){simpleForm.form.reset();}
- }]
- });
- simpleForm.render(document.body);
- </script>
- </body>
- </html>
后台文件的代码(ASP):
- <%@Language=VBScript CodePage=65001%>
- <%
- dim temp
- For Each x In Request.Form
- temp=temp& x & ":" & Request.Form(x) & ","
- next
- Response.Charset="utf-8"
- Session.CodePage=65001
- response.write "{success:true,data:'"&temp&"'}"
- %>
CSS属性float的测试文件代码:
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
- <html>
- <head>
- <title>float测试例子</title>
- <meta http-equiv="content-type" content="text/html; charset=utf-8">
- </head>
- <body>
- <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>
- </body>
- </html>