使用 EasyUI DataGrid 時,點擊「修改」按鈕彈出 Dialog,需要將當前選中行的數據填充到彈窗表單中。但實際運行發現:數據無法正確賦值,尤其是日期類字段(`Birthday`)報錯或顯示異常。
原代碼中關鍵錯誤行:
// ❌ 錯誤:row.Birthday 不是 EasyUI datebox 對象,無法調用 .datebox('getValue')
$('#txtBirthday').val(row.Birthday.datebox('getValue'));
row 是 DataGrid 返回的純 JSON 數據對象,row.Birthday 是字符串或 Date 類型的原始數據值.datebox('getValue') 是 jQuery EasyUI 插件方法,只能調用在已初始化的 datebox DOM 元素上if (row) {
$("#txtLoginId").val(row.LoginId);
$("#txtLoginPwd").val(row.LoginPwd);
$("#txtUserStateId").val(row.UserStateId);
$("#txtTeacherName").val(row.TeacherName);
$('#txtSex').val(row.Sex); // 假設是下拉框或文本框
}
// ✅ 正確:直接設置值,EasyUI datebox 會自動解析
$('#txtBirthday').val(row.Birthday);
// 如果後端返回格式不標準,需統一格式化
// 例如後端返回 "/Date(1234567890000)/" 或 "2023-01-15T00:00:00"
$('#txtBirthday').datebox('setValue', formatDate(row.Birthday));
// 通用日期格式化函數
function formatDate(dateVal) {
if (!dateVal) return '';
const date = new Date(dateVal);
if (isNaN(date.getTime())) return dateVal; // 已是字符串格式
return date.getFullYear() + '-' +
String(date.getMonth() + 1).padStart(2, '0') + '-' +
String(date.getDate()).padStart(2, '0');
}
{
text: '修改',
iconCls: 'icon-edit',
handler: function () {
var row = $('#tab').datagrid('getSelected');
if (!row) {
$.messager.alert("系統提示", "請選擇您要修改的數據!");
return;
}
// 1. 重置表單(重要:避免殘留數據)
$('#editForm').form('clear');
// 2. 加載數據到表單(EasyUI 推薦方式)
$('#editForm').form('load', row);
// form('load') 會自動匹配 name 屬性與 row 鍵名
// 3. 特殊字段單獨處理(如日期)
if (row.Birthday) {
$('#txtBirthday').datebox('setValue', formatDate(row.Birthday));
}
// 4. 打開對話框
$("#divadd").dialog({
title: '修改教師信息',
width: 350,
height: 380,
closed: false,
cache: false,
modal: true,
buttons: [{
text: '保存',
iconCls: 'icon-save',
handler: function () {
// 表單驗證
if (!$('#editForm').form('validate')) return;
// 獲取表單數據
var formData = $('#editForm').serialize();
formData += '&TeacherId=' + row.TeacherId;
$.ajax({
type: "POST",
url: "Handler.ashx?type=2",
data: formData, // 使用 serialize() 自動編碼
success: function (data) {
if (data === "ok") {
$.messager.alert("系統提示", "數據修改成功!");
$('#tab').datagrid('reload'); // 刷新列表
$('#divadd').dialog('close');
} else {
$.messager.alert("系統提示", "數據修改失敗:" + data);
}
},
error: function() {
$.messager.alert("錯誤", "請求異常,請檢查網絡");
}
});
}
}, {
text: '關閉',
iconCls: 'icon-cancel',
handler: function () {
$('#divadd').dialog('close');
}
}]
});
}
}
<div id="divadd" style="display:none;">
<form id="editForm" method="post" novalidate>
<input type="hidden" name="TeacherId" />
<table>
<tr>
<td>登錄賬號:</td>
<td><input name="LoginId" id="txtLoginId" class="easyui-textbox" required></td>
</tr>
<tr>
<td>密碼:</td>
<td><input name="LoginPwd" id="txtLoginPwd" class="easyui-textbox" type="password"></td>
</tr>
<tr>
<td>姓名:</td>
<td><input name="TeacherName" id="txtTeacherName" class="easyui-textbox" required></td>
</tr>
<tr>
<td>性別:</td>
<td>
<select name="Sex" id="txtSex" class="easyui-combobox">
<option value="男">男</option>
<option value="女">女</option>
</select>
</td>
</tr>
<tr>
<td>生日:</td>
<td><input name="Birthday" id="txtBirthday" class="easyui-datebox" data-options="formatter:myFormatter,parser:myParser"></td>
</tr>
</table>
</form>
</div>
function myFormatter(date) {
if (!date) return '';
var y = date.getFullYear();
var m = (date.getMonth() + 1).toString().padStart(2, '0');
var d = date.getDate().toString().padStart(2, '0');
return y + '-' + m + '-' + d;
}
function myParser(s) {
if (!s) return new Date();
var ss = s.split('-');
var y = parseInt(ss[0], 10);
var m = parseInt(ss[1], 10);
var d = parseInt(ss[2], 10);
if (!isNaN(y) && !isNaN(m) && !isNaN(d)) {
return new Date(y, m - 1, d);
} else {
return new Date();
}
}
| 場景 | 錯誤做法 | 正確做法 |
|---|---|---|
| 普通字段賦值 | 手動 `$('#id').val(row.key)` | `$('#form').form('load', row)` 自動匹配 |
| DateBox 賦值 | `row.Date.datebox('getValue')` | `$('#dateId').datebox('setValue', row.Date)` |
| Combobox 賦值 | `$('#combo').val(row.key)` | `$('#combo').combobox('setValue', row.key)` 或 form('load') |
| 表單提交 | 手動拼接 URL 參數 | `$('#form').serialize()` 自動編碼 |
| 數據刷新 | 重新查詢數據庫 | `$('#grid').datagrid('reload')` 客戶端刷新 |
EasyUI DataGrid 編輯彈窗的核心要點:
$('#form').form('load', row) 實現數據自動映射(要求表單 `name` 與數據 `key` 一致)datebox('setValue', value) 而非直接 `.val()`serialize() 避免手動拼接參數錯誤datagrid('reload') 刷新列表,而非重新查詢遵循 EasyUI 的數據綁定約定,能減少 80% 的手動賦值代碼和 Bug。