EasyUI Combobox 是 Web 表單中最常用的下拉選擇組件。本文整理核心屬性、關鍵方法、數據加載方式與常見問題解決方案,供開發快速查閱。
| 屬性 | 類型 | 預設值 | 說明 |
|---|---|---|---|
valueField | string | 'value' | 綁定到選項的值字段 (提交表單時的實際值) |
textField | string | 'text' | 綁定到選項的顯示字段 (用戶看到的文字) |
url | string | null | 遠程數據源 URL (返回 JSON 數組) |
data | array | null | 本地數據源 [{value:1,text:'文本'},...] |
panelHeight | number/string | 'auto' | 下拉面板高度,'auto' 自適應 |
editable | boolean | true | 是否允許用戶輸入文字 (搜索/過濾) |
multiple | boolean | false | 是否多選 (值以逗號分隔) |
required | boolean | false | 是否必填 (配合 validatebox) |
missingMessage | string | 'This field is required.' | 必填驗證失敗提示 |
filter | function | 內建過濾 | 自定義過濾函數 function(q, row){ return row.text.indexOf(q) >= 0; } |
formatter | function | 無 | 自定義選項渲染 function(row){ return '<span style="color:red">'+row.text+'</span>; } |
loader | function | 內建載入器 | 自定義數據加載邏輯 function(param, success, error){ ... } |
| 方法 | 參數 | 返回值 | 說明 |
|---|---|---|---|
getValue() | - | string | 獲取當前選中值 (valueField 對應值) |
getText() | - | string | 獲取當前選中顯示文本 (textField 對應值) |
setValue(val) | string | jQuery | 按值設置選中項 (匹配 valueField) |
setText(text) | string | jQuery | 按文本設置選中項 (匹配 textField) |
clear() | - | jQuery | 清空選擇 |
loadData(data) | array | jQuery | 加載本地數據 |
reload(url) | string | jQuery | 重新加載遠程數據 (可選新 URL) |
select(index) | number | jQuery | 按索引選中 (0-based) |
unselect(index) | number | jQuery | 取消索引選中 |
getData() | - | array | 獲取所有選項數據 |
destroy() | - | jQuery | 銷毀組件 |
<select id="cc" class="easyui-combobox" name="dept" style="width:200px;">
<option value="1" selected>部門一</option>
<option value="2">部門二</option>
<option value="3">部門三</option>
</select>
$('#cc').combobox({
valueField: 'id',
textField: 'name',
data: [
{id: 1, name: '部門一'},
{id: 2, name: '部門二'},
{id: 3, name: '部門三'}
]
});
$('#cc').combobox({
valueField: 'id',
textField: 'name',
url: '/api/departments', // 返回 [{id:1,name:'部門一'},...]
method: 'get',
onLoadSuccess: function(data) {
console.log('加載完成,共 ' + data.length + ' 條');
},
onLoadError: function() {
$.messager.alert('錯誤', '數據加載失敗');
}
});
$('#province').combobox({
url: '/api/provinces',
valueField: 'code',
textField: 'name',
onSelect: function(rec) {
$('#city').combobox('reload', '/api/cities?provinceCode=' + rec.code);
$('#city').combobox('clear');
$('#district').combobox('clear');
}
});
$('#tags').combobox({
multiple: true,
valueField: 'id',
textField: 'name',
url: '/api/tags',
formatter: function(row) {
return '<span class="tag">' + row.name + '</span>';
}
});
$('#search').combobox({
editable: true,
hasDownArrow: false, // 隱藏下拉箭頭,純輸入框
valueField: 'id',
textField: 'name',
url: '/api/search?q={q}', // {q} 會被替換為用戶輸入
mode: 'remote', // 遠程過濾模式
filter: function(q, row) { // 本地過濾模式時生效
return row.name.indexOf(q) >= 0;
}
});
// 方式1: 直接獲取
var deptId = $('#dept').combobox('getValue');
var deptName = $('#dept').combobox('getText');
// 方式2: 表單序列化 (需 name 屬性)
var formData = $('#myForm').serialize(); // dept=1&name=xxx
// 方式3: easyui form 插件
$('#myForm').form('submit', {
url: '/api/save',
onSubmit: function() { return $(this).form('validate'); },
success: function(data) { ... }
});
| 問題 | 原因 | 解決方案 |
|---|---|---|
| 無法顯示中文/亂碼 | 頁面/響應編碼不一致 | 頁面 ``,後端響應 `Content-Type: application/json;charset=UTF-8` |
| setValue 不生效 | 值類型不匹配 (數字 vs 字串) | 確保 valueField 類型一致:`setValue('1')` vs `setValue(1)` |
| 遠程數據不顯示 | JSON 格式錯誤/字段名不匹配 | 檢查返回結構、valueField/textField 是否與 JSON key 對應 |
| 多選值獲取異常 | 分隔符預設為逗號 | 檢查後端分割邏輯,或自定義 `separator: ';'` |
| 面板寬度異常 | panelWidth 未設置 | 設置 `panelWidth: 300` 或 CSS `.combo-panel { width: auto !important; }` |
| 動態添加選項 | 無直接方法 | 獲取數據 → push 新項 → `loadData(newData)` 重載 |
$('#cc').combobox({
onLoadSuccess: function(data) { }, // 數據加載成功
onLoadError: function() { }, // 數據加載失敗
onSelect: function(record) { }, // 選中項目
onUnselect: function(record) { }, // 取消選中
onChange: function(newVal, oldVal) { }, // 值變化 (含程序設值)
onBeforeLoad: function(param) { }, // 加載前 (可修改 param)
onShowPanel: function() { }, // 下拉面板顯示
onHidePanel: function() { }, // 下拉面板隱藏
onClick: function(record) { } // 點擊選項
});
核心提示:
valueField對應提交值 (數據庫 ID),textField對應顯示文本。獲取值用getValue(),獲取文本用getText()。設置值用setValue(),設置文本用setText()。遠程數據務必返回標準 JSON 數組,字段名與 valueField/textField 完全一致。
EasyUI Combobox 功能豐富,掌握核心屬性與方法,配合事件鉤子,可覆蓋 95% 表單下拉場景。建議項目中封裝通用 Combobox 組件,統一風格、驗證、錯誤處理。