1、解決方案背景:
項目中偶然需要用到easyui的combobox的組件,但是本組件自己沒有包含全選的api事件。搜索了一些解決方案,但是不是很符合,后來發現是因為所使用的版本不一致所導致的。項目中使用的1.5的版本,而網上大部分的解決方案都是采用的自定義onSelect的方案,自己動手試過,確實不能,因為1.5版本的組件,在自定義onSelect的函數觸發后,選擇 了全部的值賦值給當前的組件,在賦值的同時,又會自動的觸發onSelect的事件,會不斷的陷入死循環中去。后來自己決定重新實現解決方案,重新定義onClick的事件,此事件是在1.5版本之后才有效使用的,下面介紹實現的具體方案。
2、實際解決方案:
自己封裝AllCheckCombobox.js.源代碼如下所示:
/** *自己擴展easyui的 combobox,使其能夠有全選和反選的功能。 **/ var AllCheckCombobox = (function (mod,selectId){ var select = $("#"+selectId); /* * combobox獲取data的函數,可以替換成動態后台ajax獲取,此處只是靜態數據模擬。 */ var getData = function (){ var data =[{"text":"長沙","value":"111"},{"text":"常德","value":"222"}]; data.unshift({"text":"全選/反選","value":""}); return data; }; /* * 擴展的核心函數之一,自己擴展combobox的onclick的函數,判斷是否是全選/反選 選項, * 若果是 則選中全部的選項,否則,清空全部的選項 */ var onclick = function (record){ var valueField = select.combobox("options").valueField; if(!record[valueField]){ var data = select.combobox("getData"); var values = select.combobox("getValues"); var selectVaues = []; if((data.length - 1) != values.length){ data.reduce(function(prev, current, index, array){ selectVaues.push(current[valueField]); },selectVaues); }else{ selectVaues.push(record[valueField]); } select.combobox('setValues', selectVaues); } }; /* * combobox的初始化函數,還可以自己設定一些其他的選項,可以參看easyui的官網。 */ mod.initCombobox = function (){ $('#'+selectId).combobox({ valueField : 'value', textField : 'text', multiple : true, editable : false, panelHeight : 'auto', panelMaxHeight : 300, data : getData(), onClick:onclick, label : "城市 :", labelPosition : "before", labelAlign : 'right' }); }; return mod; })(window.AllCheckCombobox || {},'select');
具體的項目中的data 可以沖后台ajax獲取,在動態獲取到data數據后,自動的在最前面給增加一個"全選"的選項,擴展的onclick的事件,也是對當前的選擇的值進行判斷,得出的結果,來進行對當前的下拉框賦值操作。
3、測試代碼:
<!DOCTYPE html> <html> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta charset="UTF-8"> <title>測試頁面</title> <link rel="stylesheet" type="text/css" href="easyui/themes/gray/easyui.css"> <link rel="stylesheet" type="text/css" href="easyui/themes/icon.css"> </head> <body> <div id="panel" style="width:98%;padding:10px 10px;"> <input id="select" style="width:20%;" value=""/> </div> </body> <script type="text/javascript" src="easyui/jquery.min.js"></script> <script type="text/javascript" src="easyui/jquery.easyui.min.js"></script> <script type="text/javascript" src="easyui/locale/easyui-lang-zh_CN.js"></script> <script type="text/javascript" src="AllCheckCombobox.js"></script> <script type="text/javascript"> $(function(){ AllCheckCombobox.initCombobox(); }); </script> </html>
4、測試效果:
選擇全選的選項,就會自動的選擇下面的所有的值,獲取當前選中的值,可以使用easyui的combobox的getValues獲取。