在 EasyUI treegrid 中通過 formatter 渲染單選按鈕組,需根據數據值默認選中對應項,並保證同組互斥。原代碼:
function formatProgress(value, row) {
if (value == '1') {
var s = '<input type="radio" value="1" checked="true">分行'
+ '<input type="radio" value="2">支行'
+ '<input type="radio" value="3">網點';
} else if (value == '2') { ... }
return s;
}
問題:所有行的 radio 共用同一 name 導致全表只能選一個;去掉 name 則失去互斥。
function formatProgress(value, row, index) {
var name = "orgtype_" + index; // 行級唯一 name
var checked1 = value == '1' ? 'checked' : '';
var checked2 = value == '2' ? 'checked' : '';
var checked3 = value == '3' ? 'checked' : '';
return '<input type="radio" name="' + name + '" value="1" ' + checked1 + '>分行'
+ '<input type="radio" name="' + name + '" value="2" ' + checked2 + '>支行'
+ '<input type="radio" name="' + name + '" value="3" ' + checked3 + '>網點';
}
function getSelectedTypes() {
var rows = $('#tg').treegrid('getRows');
var result = [];
rows.forEach(function(row, i) {
var name = "orgtype_" + i;
var val = $('input[name="' + name + '"]:checked').val();
if (val) result.push({id: row.id, type: val});
});
return result;
}
$('#tg').treegrid({
onLoadSuccess: function() {
// 渲染後綁定 change 事件
$('input[type="radio"][name^="orgtype_"]').change(function() {
var rowIndex = $(this).attr('name').split('_')[1];
var row = $('#tg').treegrid('getRows')[rowIndex];
row.orgtype = $(this).val();
$('#tg').treegrid('updateRow', {index: rowIndex, row: row});
});
}
});
row.orgtype 動態輸出 checked 屬性。