Ext2.0的form不單增加了時間輸入控件、隱藏輸入控件,還修改了創建方法,通過formpanel代替了原來form,column也根據新的布局定義更新了定義方式。總體來說,定義一個form更簡單便捷了。本文將通過一個實例介紹一下2.0的form的創建以及其大部分控件的使用方法,因水平有限,錯漏難免,忘大家多多諒解!
我們先來看看我們將要設計的form的情況:
 
呵呵,form有點雜亂,不過在這個fomr里包含了絕大部分Ext2.0的控件,我將會和大家一起探討一下這些控件的使用。
在創建一個form之前,我們先增加以下語句:
Ext.QuickTips.init(); 
Ext.form.Field.prototype.msgTarget = 'side';
第一句的目的是為需要的元件提供提示信息功能,form的主要提示信息就是客戶端驗證的錯誤信息了。
第二句的目的就是設置控件的錯誤信息顯示位置,主要可選的位置有:
| 位置值 | 描述 | 
| qtip | 當鼠標移動到控件上面時顯示提示 | 
| title | 在瀏覽器的標題顯示,但是測試結果是和qtip一樣的 | 
| under | 在控件的底下顯示錯誤提示 | 
| side | 在控件右邊顯示一個錯誤圖標,鼠標指向圖標時顯示錯誤提示 | 
| [element id] | 錯誤提示顯示在指定id的HTML元件中 | 
這個大家可以根據各人喜好設置,我習慣使用“side”,這里有一點要注意的,就是注意控制控件的寬度,以防不夠寬度顯示錯誤圖標,這個下面會說到。
好了,現在創建我們的form,2.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');邊的類型設置了內補丁5px(bodyStyle:'padding:5px');總寬度是600px;設置了面板的邊角是圓弧過度的(frame:true),我設置這個屬性主要目的不是因為邊角,而是因為背景,如果不設置這個,背景顏色將為白色,設置了這個將會加入海藍色的背景圖,好看點;還設置了form控件的標題寬度是80px(labelWidth:80)。還有一些其它的設置選項,我這里就不多說,大家可以參看2.0的API。
items數組的設置是我們的重點了,form上的所有控件都是在這里設置的。
從form的結構圖中看到,form整體上是分了兩列的(實際上不是的,呵呵)。因為要分列,所以要使用columnLayout類。在使用columnLayout類之前,我們需要了解一下CSS中float屬性的作用,改屬性主要作用是設置對象是否及如何浮動,屬性值為none、left和right三個。column設置是left,意思就是對象浮在左邊的。那這個有什么作用呢?其實這個和我們在word中輸入文字,默認文字是左對齊的,當一行文字的寬度超過頁面的寬度時將自動換行是一樣的。 我們通過一個例子來說明一下。
首先我們定義一個div,背景色是黑色,寬度和高度都是200:
 <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> 

6個子div有序的按左對齊方式排列在一起了,當一行的子div的寬度超過了父div的寬度時,子div自動換行到了第二行。
不知道大家是否看得明白?看不明白自己再動手改變一下子div的寬度和高度,看看效果。column的工作方式就是這樣的。明白這個很重要,因為在定義checkbox和radio的時候,如果想它們的選項在同一行,就要注意column的寬度,不然就無法讓他們在同一行。不過現在column是通過百分比來定義寬度的,我們只要控制好百分比就行了。
好了,我們繼續寫form,因為要用到column,所以我們先在formpanel的itmes加入一個column的定義:
{
layout:'column', 
border:false,
labelSeparator:':',
items:[]
}
代碼里定義了在這里使用的是columnlayout(layout:'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%):
從代碼中可以看到,除了列寬設置為25%外,其它的列設置和第一控件是一樣。Formlayout里加入了一個類型為radio的控件。控件的標題是性別,控件的選擇顯示文本是男(boxLabel:'男),input的name屬性值是sex(name: 'sex'),該控件默認是已選的(checked:true),控件的值(value)是男(inputValue:'男'),input的寬度是95%。在這里我還設置一個css屬性,頂部的外補丁為5px(style:'margin-top:5px'),原因是為了選擇按鈕和標題對齊,大家可以將該屬性去掉然后看看效果。
第二個raido控件的列設置就有所不同,因為它不需要標題,所以要設置隱藏標題(hideLabels:true),標題的寬度設置為0(labelWidth:0),還要設置其標題分隔符號為空(labelSeparator:'')。其余的設置和第一個radio的設置沒有不同,只是input的值不同了。
我們已經設置了3列,3列的列寬分別為50%、25%、25%,根據float的原則,下一列將從第二行開始。
在第二行第一列我們要增加的是一個日期選擇控件:
{
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%,出來留出空位給錯誤信息外,還可以讓控件與上一行的姓名的寬度相同,整列看起來比較整齊。
日期控件的設置和普通文本輸入的設置一樣簡單,這里就不多說了。不過要說到的是漢化的問題。在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 : "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的格式的,這個自己根據情況決定,呵呵。
| 
 
 | 
新聞熱點
疑難解答