官术网_书友最值得收藏!

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ù)
主站蜘蛛池模板: 虎林市| 依安县| 正镶白旗| 彭州市| 景洪市| 会东县| 石屏县| 上栗县| 涟水县| 道孚县| 信丰县| 阳高县| 兴义市| 兴和县| 民乐县| 潮安县| 讷河市| 沂南县| 晋宁县| 崇义县| 红桥区| 商河县| 盐池县| 新民市| 饶平县| 元阳县| 谢通门县| 夏津县| 呼玛县| 郑州市| 贡觉县| 玉龙| 东阳市| 当阳市| 上蔡县| 上虞市| 镇赉县| 伊金霍洛旗| 铜陵市| 庆云县| 福州市|