- jQuery EasyUI從零開始學(xué)
- 施堯
- 3926字
- 2019-12-06 14:08:59
2.2 組合簡(jiǎn)介
2.2.1 組合(Combo)
組合是在頁(yè)面上顯示一個(gè)文本框和一個(gè)下拉面板,它是創(chuàng)建其他復(fù)雜組件(例如:combobox、combotree、combogrid)的基礎(chǔ),利用組合我們也可以自定義開發(fā)一些更加復(fù)雜的組件,例如在第6章中利用組合開發(fā)起止日期框組件。本節(jié)將向讀者講解組合和組合框兩個(gè)組件的使用方法。
組合的依賴關(guān)系如下:
- textbox
- panel
組合擴(kuò)展于:
- textbox
組合的默認(rèn)配置定義在$.fn.combo.defaults中。
1. 組合的用法
可以通過(guò)JavaScript從<input>或者<select>標(biāo)記創(chuàng)建組合,注意使用標(biāo)記創(chuàng)建組合是不合法的。例如:
01 <input id="cc" value="1"> 02 $('#cc').combo({ 03 required:true, 04 multiple:true 05 });
2. 組合屬性
組合常用屬性的說(shuō)明見表2.11。
表2.11 組合常用屬性說(shuō)明

3. 組合的事件
組合常用事件的說(shuō)明見表2.12。
表2.12 組合常用事件說(shuō)明

4. 組合的方法
組合常用方法的說(shuō)明見表2.13。
表2.13 組合常用方法說(shuō)明

5. 深入理解EasyUI依賴關(guān)系
通過(guò)前面的學(xué)習(xí)讀者可以發(fā)現(xiàn)組合依賴于文本框和面板,其中擴(kuò)展于文本框,因此我們可以使用文本框的屬性來(lái)初始化組合,但是如果需要設(shè)置面板屬性的話,我們需要通過(guò)組合的panel方法先獲取面板對(duì)象再設(shè)置其屬性,例如:
01 <body> 02 <input id="cc" name="dept" value="aa"> 03 <div id="footer">底部</footer> 04 </body> 05 <script> 06 $(function(){ 07 $('#cc').combo({ 08 //文本框?qū)傩? 09 iconCls:'icon-search', 10 onClickButton:function(){ 11 alert("11"); 12 }, 13 //組合屬性 14 hasDownArrow:false, 15 }); 16 //設(shè)置面板屬性 17 var panel = $('#cc').combo("panel"); 18 panel.panel({ 19 footer:"#footer" 20 }); 21 }); 22 </script>
最終運(yùn)行結(jié)果如圖2.11所示。
再看下面的代碼,我們使用組合的textbox方法獲取文本框?qū)ο螅又O(shè)置文本框?qū)傩裕纾?/p>
01 var tb = $('#cc').combo("textbox"); 02 tb.textbox({ 03 width:300 04 });
此時(shí)運(yùn)行結(jié)果如圖2.12所示。

圖2.11 設(shè)置依賴組件屬性

圖2.12 設(shè)置依賴組件屬性
可以發(fā)現(xiàn)此時(shí)并沒有設(shè)置成功組合中的文本框?qū)傩裕喾催@段代碼在原先的組合上新增了一個(gè)文本框。這是因?yàn)榻M合本身并沒有重寫或新增textbox方法,組合使用的其實(shí)是文本框的textbox方法,該方法返回的是文本框中展示值框的對(duì)象,開發(fā)者可以為其綁定指定的事件。但是如果使用展示值框來(lái)初始化文本框,就會(huì)在其基礎(chǔ)上創(chuàng)建一個(gè)新的文本框。
2.2.2 組合框(ComboBox)
組合框由一個(gè)可編輯的文本框和一個(gè)下拉面板組成。用戶可以在下拉面板中選中一個(gè)或者多個(gè)值,同樣可以直接在文本框內(nèi)輸入內(nèi)容或者在下拉面板中選中一個(gè)或多個(gè)值。
組合框依賴關(guān)系如下:
- combo
組合框擴(kuò)展于:
- combo
組合框的默認(rèn)配置定義在$.fn.combobox.defaults中。
1. 創(chuàng)建組合框
可以通過(guò)<select>標(biāo)記創(chuàng)建一個(gè)組合框,此時(shí)可以將選項(xiàng)直接寫入到<select>元素中。例如:
01 <select id="cc" class="easyui-combobox" name="dept" style="width:200px;"> 02 <option value="aa">item1</option> 03 <option>item2</option> 04 <option>item3</option> 05 <option>item4</option> 06 <option>item5</option> 07 </select>
也可以通過(guò)<input>標(biāo)記創(chuàng)建組合框,例如:
01 <input id="cc" name="dept" value="aa"> 02 $('#cc').combobox({ 03 url:'combobox_data.json', 04 valueField:'id', 05 textField:'text' 06 });
也可以創(chuàng)建兩個(gè)相互依賴的組合框,例如:
01 <input id="cc1" class="easyui-combobox" data-options=" 02 valueField: 'id', 03 textField: 'text', 04 url: 'get_data1.php', 05 onSelect: function(rec){ 06 var url = 'get_data2.php?id='+rec.id; 07 $('#cc2').combobox('reload', url); 08 }"> 09 <input id="cc2" class="easyui-combobox" data-options="valueField:'id',textField:'text'">
2. 組合框?qū)傩?/b>
組合框常用屬性見表2.14。
表2.14 組合框常用屬性說(shuō)明

下面將具體講解如何使用組合框從服務(wù)器和本地加載數(shù)據(jù),組合框加載數(shù)據(jù)時(shí)可以接收J(rèn)SON格式數(shù)據(jù),通過(guò)如下方法加載本地?cái)?shù)據(jù),部分代碼如下:
01 $('#cc').combobox({ 02 valueField:'id', 03 textField:'city', 04 data:[ 05 {"id":1," country":"中國(guó)","city":"北京市"}, 06 {"id":2," country":"中國(guó)","city":"上海市"}, 07 {"id":3," country":"中國(guó)","city":"重慶市"}, 08 {"id":4," country":"中國(guó)","city":"天津市"}, 09 {"id":5," country":"美國(guó)","city":"華盛頓"}, 10 {"id":6," country":"美國(guó)","city":"紐約"}, 11 {"id":7," country":"美國(guó)","city":"舊金山"}, 12 {"id":8," country":"英國(guó)","city":"倫敦"}, 13 {"id":9," country":"英國(guó)","city":"伯明翰"}, 14 {"id":10," country":"英國(guó)","city":"利茲"}, 15 {"id":11," country":"法國(guó)","city":"巴黎"}, 16 {"id":12," country":"法國(guó)","city":"馬賽"}, 17 {"id":13," country":"法國(guó)","city":"里昂"}, 18 ], 19 });
我們也可以通過(guò)服務(wù)器加載數(shù)據(jù),服務(wù)器部分代碼如下:
01 $city = array( 02 array("id"=>1," country"=>"中國(guó)","city"=>"北京市"), 03 array("id"=>2," country"=>"中國(guó)","city"=>"上海市"), 04 array("id"=>3," country"=>"中國(guó)","city"=>"重慶市"), 05 array("id"=>4," country"=>"中國(guó)","city"=>"天津市"), 06 array("id"=>5," country"=>"美國(guó)","city"=>"華盛頓"), 07 array("id"=>6," country"=>"美國(guó)","city"=>"紐約"), 08 array("id"=>7," country"=>"美國(guó)","city"=>"舊金山"), 09 array("id"=>8," country"=>"英國(guó)","city"=>"倫敦"), 10 array("id"=>9," country"=>"英國(guó)","city"=>"伯明翰"), 11 array("id"=>10," country"=>"英國(guó)","city"=>"利茲"), 12 array("id"=>11," country"=>"法國(guó)","city"=>"巴黎"), 13 array("id"=>12," country"=>"法國(guó)","city"=>"馬賽"), 14 array("id"=>13," country"=>"法國(guó)","city"=>"里昂") 15 ); 16 echo JSON($city);
對(duì)應(yīng)的客戶端部分代碼如下:
01 $('#cc').combobox({ 02 valueField:'id', 03 textField:'city', 04 url:" getData.php" 05 });
最終運(yùn)行結(jié)果如圖2.13所示。

圖2.13 使用組合框加載數(shù)據(jù)
通過(guò)本地加載數(shù)據(jù)時(shí),需要給data屬性賦予一個(gè)JSON格式的數(shù)據(jù),使用數(shù)字1來(lái)存儲(chǔ)數(shù)據(jù)要比使用“北京市”來(lái)存儲(chǔ)數(shù)據(jù)更加節(jié)省磁盤空間,而且避免了編碼問題,因此在這里使用id字段來(lái)表示存儲(chǔ)值,使用city字段來(lái)表示展示值。組合框中的valueField屬性指定存儲(chǔ)值的字段,textField屬性指定展示值字段。通過(guò)服務(wù)器加載數(shù)據(jù),其實(shí)就是將數(shù)據(jù)保存在服務(wù)器端,其本質(zhì)都是通過(guò)JSON格式數(shù)據(jù)來(lái)初始化組合框,url屬性提供組合框初始化數(shù)據(jù)的服務(wù)器地址。
在上述例子的JSON格式數(shù)據(jù)中有一個(gè)country字段,該字段表示每個(gè)城市所在的國(guó)家,組合框可以通過(guò)groupField屬性對(duì)數(shù)據(jù)進(jìn)行分組,使用groupFormatter屬性設(shè)置各個(gè)分組的展示值,formatter屬性可以設(shè)置組合框中每一行數(shù)據(jù)的展示值。接下來(lái)我們將把數(shù)據(jù)按照國(guó)家進(jìn)行分組,并將國(guó)家名格式化為該國(guó)家的國(guó)旗圖標(biāo),然后再對(duì)各個(gè)國(guó)家首都進(jìn)行加黑處理。部分代碼如下:
01 $('#cc').combobox({ 02 //擴(kuò)展自Combo的屬性 03 width: 400, 04 panelHeight:450, 05 //ComboBox新增屬性 06 valueField:'id', 07 textField:'city', 08 groupField:'country', 09 url:"server/getCountry.php", 10 groupFormatter:function(group){ 11 if(group == "中國(guó)"){ 12 return "<img src='img/zg.png'></img>"; 13 }else if(group == "美國(guó)"){ 14 return "<img src='img/mg.png'></img>"; 15 }else if(group == "英國(guó)"){ 16 return "<img src='img/yg.png'></img>"; 17 }else if(group == "法國(guó)"){ 18 return "<img src='img/fg.png' width='36' height='27'></img>"; 19 }else{ 20 return ""; 21 } 22 }, 23 formatter:function(row){ 24 var opts = $(this).combobox("options"); 25 var text = row[opts.textField]; 26 if(text == "北京市"||text == "華盛頓"||text == "倫敦"||text == "巴黎"){ 27 return "<b>"+text+"</b>"; 28 } 29 else{ 30 return text; 31 } 32 }, 33 });
在上述代碼中g(shù)roupFormatter屬性的參數(shù)group代表的是各個(gè)分組的名稱,例如中國(guó)、美國(guó)等,程序會(huì)自動(dòng)檢測(cè)有多少個(gè)分組,并將每個(gè)類型的分組都使用一次groupFormatter中的方法格式化。formatter屬性中的row參數(shù)代表初始化數(shù)據(jù)中的每一行數(shù)據(jù),例如{"id":1,"country":"中國(guó)","city":"北京市"},程序會(huì)對(duì)初始化數(shù)據(jù)使用format中的方法進(jìn)行格式化,因此通過(guò)這個(gè)方法我們可以自定義組合框中每一行數(shù)據(jù)的展示格式。options方法在前面的章節(jié)中曾經(jīng)提及過(guò),它返回的是當(dāng)前組件的配置,因此通過(guò)row[opts.textField]可以獲取組合框textField的值。最終運(yùn)行結(jié)果如圖2.14所示。

圖2.14 使用組合框?qū)υO(shè)計(jì)數(shù)據(jù)的展示值
【本節(jié)詳細(xì)代碼參見隨書源碼:\源碼\easyui\example\c2\comboboxFormat.html】
組合框是由可編輯的文本框和下拉面板組成的。用戶同樣可以在文本框內(nèi)輸入字符串來(lái)檢索數(shù)據(jù),因?yàn)楫?dāng)組合框中包含世界所有的國(guó)家的主要城市時(shí),通過(guò)下拉面板一條條地查找數(shù)據(jù)顯然效率低下,此時(shí)用戶更希望在文本框內(nèi)中輸入需要查找的城市關(guān)鍵字,下拉面板自動(dòng)將包含關(guān)鍵字的數(shù)據(jù)顯示出來(lái)。mode屬性指定當(dāng)用戶在組合框內(nèi)輸入關(guān)鍵字時(shí),組合框從何處獲取數(shù)據(jù),當(dāng)設(shè)置其值為remote時(shí),組合框會(huì)將用戶輸入的關(guān)鍵字通過(guò)http請(qǐng)求以參數(shù)q傳輸給服務(wù)器端,服務(wù)器端會(huì)將查詢到的數(shù)據(jù)返回給組合框,mode屬性設(shè)置為local時(shí),可以通過(guò)filter屬性自定義規(guī)則在本地進(jìn)行檢索。服務(wù)器端檢索數(shù)據(jù)較為復(fù)雜,接下來(lái)本書先講解如何從本地檢索數(shù)據(jù),我們對(duì)上個(gè)例子進(jìn)行修改,使用戶輸入國(guó)家時(shí),下拉面板只顯示該國(guó)家的城市,新增代碼如下:
01 mode: "local", 02 filter:function(q,row) 03 { 04 var opts = $('#cc').combobox("options");//獲取該組合框全部的屬性 05 var groupname =row[opts.groupField];//獲取該行數(shù)據(jù)的分組值 06 if(groupname == q){ 07 return row[opts.textField]; //當(dāng)用戶輸入的值等于分組值時(shí)則顯示數(shù)據(jù) 08 } 09 else{ 10 return false; 11 } 12 }
最終運(yùn)行結(jié)果如圖2.15所示。

圖2.15 本地檢索數(shù)據(jù)
提示
filter屬性默認(rèn)檢索規(guī)則是顯示包含用戶輸入的關(guān)鍵字的數(shù)據(jù)。例如輸入“北京”,將會(huì)檢索到“北京市”。
下面我們將探討服務(wù)器端檢索數(shù)據(jù)的方法,使用服務(wù)器端檢索數(shù)據(jù)需要用到如下屬性。
- mode:設(shè)置為romote時(shí)將從服務(wù)器端檢索數(shù)據(jù)。
- loader:用于從服務(wù)器檢索數(shù)據(jù)。
- loadFilter:對(duì)服務(wù)器端檢索后的數(shù)據(jù)進(jìn)一步過(guò)濾。
部分代碼如下:
01 mode: "remote", 02 loader:function(param,success,error){ 03 var q = param.q; //獲取文本框中輸入的數(shù)據(jù) 04 if(q.length<1){ 05 return false; 06 } 07 $.ajax({ //利用ajax請(qǐng)求獲取數(shù)據(jù) 08 url: ' filterCountry.php?q='+q, 09 dataType: 'json', 10 type:'get', 11 success: function(data){ 12 success(data); 13 }, 14 error:function(){ 15 error(); 16 } 17 }); 18 } 19 loadFilter:function(data){ 20 //服務(wù)器端檢索完畢后的回調(diào)函數(shù),data為服務(wù)器返回的值, 21 //開發(fā)者可以進(jìn)一步對(duì)數(shù)據(jù)進(jìn)行過(guò)濾 22 return data; 23 }
【本節(jié)詳細(xì)代碼參見隨書源碼:\源碼\easyui\example\c2\ comboboxFilter.html】
loader屬性為一個(gè)函數(shù),其參數(shù)param為需要被傳輸?shù)椒?wù)器的數(shù)據(jù),通過(guò)param.q可以得到用戶輸入的關(guān)鍵字,然后使用ajax的get方法向服務(wù)器傳輸用戶輸入的關(guān)鍵字,服務(wù)器將檢索后的結(jié)果通過(guò)JSON格式返回,ajax傳輸成功后調(diào)用loader函數(shù)的success參數(shù),該參數(shù)接收服務(wù)器返回的數(shù)據(jù),最后會(huì)調(diào)用loadFilter屬性中的方法,該方法可以對(duì)檢索后的數(shù)據(jù)進(jìn)一步過(guò)濾。服務(wù)器端代碼如下:
01 $limit = $_GET['q']; 02 $result = db::select("select * from country where country = :country",array( 03 "country"=>$limit 04 ))->getResult(); 05 echo Data::toJson($result);
運(yùn)行上述程序后讀者可以發(fā)現(xiàn),使用服務(wù)器檢索數(shù)據(jù)在組合框初始化時(shí),并不會(huì)加載全部的數(shù)據(jù)。因此通過(guò)服務(wù)器檢索數(shù)據(jù)更適合用于數(shù)據(jù)量極大時(shí),用戶并不希望顯示全部的數(shù)據(jù),僅僅希望查找自己感興趣的數(shù)據(jù)的情況下使用。
到目前為止組合框還有兩個(gè)屬性沒有講解,一個(gè)為method屬性,另一個(gè)為queryParams屬性。在實(shí)際項(xiàng)目開發(fā)中,經(jīng)常會(huì)遇到權(quán)限限制的問題,例如在網(wǎng)站上有很多個(gè)用戶,每個(gè)用戶下?lián)碛卸鄠€(gè)項(xiàng)目,我們希望用戶只能看到自己的項(xiàng)目。例如我們希望用戶只能看到中國(guó)下的全部城市,此時(shí)我們會(huì)通過(guò)queryParams屬性增加一些參數(shù),這些參數(shù)將會(huì)在組合框初始化時(shí)傳輸?shù)椒?wù)器,服務(wù)器根據(jù)這些參數(shù)即可限制顯示給用戶的數(shù)據(jù)范圍,method屬性指定以何種方式發(fā)送這些參數(shù),它可以是get或者post方法。如下代碼限制用戶僅能查看中國(guó)的城市:
01 url:" getData.php", 02 queryParams:{"c":'中國(guó)'}, 03 method: 'get'
服務(wù)器獲取傳輸過(guò)來(lái)的參數(shù)并且進(jìn)行處理,部分代碼如下:
01 $limit = $_GET['c']; 02 $result = db::select("select * from country where country = :country",array( 03 "country"=>$limit 04 ))->getResult(); 05 echo Data::toJson($result);
此時(shí)組合框內(nèi)將僅僅顯示中國(guó)范圍內(nèi)的城市。
提示
loader屬性中的param參數(shù)是一個(gè)包含queryParams屬性和用戶輸入值的對(duì)象,在上例中我們也可以通過(guò)param.c獲取到queryParams屬性中的限制參數(shù),這種設(shè)計(jì)保證我們?cè)谙蚍?wù)器檢索數(shù)據(jù)時(shí)也可以限制在指定范圍內(nèi)檢索。
看到這里讀者可能會(huì)對(duì)組合框的屬性感到繁雜,其實(shí)組合框一共有三大類屬性,分別是:
(1)值類屬性。例如valueField屬性指定存儲(chǔ)值字段,textField屬性指定展示值字段,groupField屬性指定分組值字段,由于valueField、textField、groupField屬性僅僅是針對(duì)JSON格式內(nèi)的數(shù)據(jù),因此展示值只能是一段字符串,并不豐富。對(duì)此組合框提供了groupFormatter屬性來(lái)將分組字段內(nèi)容轉(zhuǎn)換成任意的展示格式,提供formatter屬性將展示值字段內(nèi)容進(jìn)一步格式化成任意形式。
(2)獲取數(shù)據(jù)屬性。組合框可以接受JSON格式數(shù)據(jù),提供本地獲取數(shù)據(jù)和服務(wù)器端獲取數(shù)據(jù)兩種形式。本地獲取數(shù)據(jù)時(shí)直接設(shè)置data屬性值即可,服務(wù)器端獲取數(shù)據(jù)需要設(shè)置url屬性為初始化數(shù)據(jù)的服務(wù)器地址。為了只顯示指定范圍內(nèi)的數(shù)據(jù)可以在queryParams中增加一些限制參數(shù),通過(guò)method屬性指定這些參數(shù)以何種方法傳輸給服務(wù)器端。
(3)檢索數(shù)據(jù)屬性。組合框提供本地檢索和服務(wù)器檢索數(shù)據(jù)兩種形式。本地檢索數(shù)據(jù)時(shí),只需要在filter屬性中定義一系列的檢索規(guī)則即可,本地檢索數(shù)據(jù)在初始化時(shí)仍然會(huì)加載全部數(shù)據(jù)。通過(guò)服務(wù)器端檢索數(shù)據(jù)時(shí),需要設(shè)置mode屬性值為remote,在loader屬性中向檢索服務(wù)器發(fā)送ajax請(qǐng)求,接收到服務(wù)器返回的數(shù)據(jù)后會(huì)調(diào)用loadFilter屬性對(duì)檢索后的數(shù)據(jù)進(jìn)一步過(guò)濾。
3. 組合框事件
組合框常用事件說(shuō)明見表2.15。
表2.15 組合框常用事件說(shuō)明

onBeforeLoad是在數(shù)據(jù)加載前觸發(fā),其參數(shù)param表示此次數(shù)據(jù)加載請(qǐng)求中包含的全部參數(shù),通常用在向服務(wù)器發(fā)送加載數(shù)據(jù)請(qǐng)求前檢查請(qǐng)求的參數(shù)。
組合框事件的record參數(shù)為用戶操作的行對(duì)象,包括用戶操作某行數(shù)據(jù)的存儲(chǔ)值、展示值以及分組值。
提示
在EasyUI中很多參數(shù)都是對(duì)象,如果讀者不清楚參數(shù)的具體含義,可以使用本書在2.1.2節(jié)中提供的writeObj函數(shù)打印對(duì)象。
4. 組合框方法
組合框常用方法說(shuō)明見表2.16。
表2.16 組合框常用方法說(shuō)明

其中setValues方法需要在組合框設(shè)置為多選模式時(shí)才能選中多個(gè)值。設(shè)置組合框的值的含義是選中面板中指定的數(shù)據(jù),并將選中數(shù)據(jù)的展示值顯示在文本框中。
01 $('#cc').combobox("setValue","1");//選中單個(gè)數(shù)據(jù) 02 $('#cc').combobox("setValues","1,2");//選中多個(gè)數(shù)據(jù)
- 流量的秘密:Google Analytics網(wǎng)站分析與優(yōu)化技巧(第2版)
- LabVIEW 2018 虛擬儀器程序設(shè)計(jì)
- arc42 by Example
- Python語(yǔ)言程序設(shè)計(jì)
- Expert Android Programming
- SSM輕量級(jí)框架應(yīng)用實(shí)戰(zhàn)
- 匯編語(yǔ)言編程基礎(chǔ):基于LoongArch
- 深入剖析Java虛擬機(jī):源碼剖析與實(shí)例詳解(基礎(chǔ)卷)
- Rust游戲開發(fā)實(shí)戰(zhàn)
- Swift語(yǔ)言實(shí)戰(zhàn)晉級(jí)
- Java程序設(shè)計(jì)教程
- Offer來(lái)了:Java面試核心知識(shí)點(diǎn)精講(框架篇)
- 零基礎(chǔ)學(xué)編程系列(全5冊(cè))
- Getting Started with hapi.js
- Mastering Python