
在使用tabulator的list或select编辑器时,我们经常面临一个场景:下拉选项需要向用户展示易于理解的文本描述(例如“张三老师”),但在后台数据处理或api交互时,我们更需要其对应的唯一标识符(例如“teacherid: 101”)。tabulator的默认行为通常会将选中的值直接显示在单元格中。这意味着如果下拉选项的值是id,单元格就会显示id;如果值是标签,虽然显示友好,但我们却失去了对后端有意义的id。这在需要进行ajax查询或数据持久化时,会造成数据处理上的不便。
例如,在选择一位“教授”时,我们希望单元格显示“Castillo, Juan”,但实际存储在数据模型中的是其ID“3”。当单元格被编辑并保存后,cellEdited事件应该能获取到ID“3”,而不是显示的标签。
解决这一问题的关键在于理解Tabulator中editor和formatter的职责分离。
通过这种分离,我们可以让editor将ID存储到单元格的数据模型中,然后使用一个自定义的formatter来根据这个ID查找并显示对应的标签。
以下是实现“存储ID,显示Label”功能的详细步骤和代码示例。
首先,我们需要一个包含所有可能选项的列表,其中每个选项都包含一个value(用于内部存储的ID)和一个label(用于显示给用户的文本)。
// 假设这是从后端获取的教师列表
const teacherList = [
{"value": "3", "label": "Castillo, Juan"},
{"value": "4", "label": "Baracus, Mario"},
{"value": "5", "label": "Smith, John"},
{"value": "6", "label": "Ingalls, Laura"}
];
// 示例表格数据
var tableData = [
{id:1, name:"Billy Bob", age:"12", gender:"male", profesorId:"3"}, // 注意这里存储的是ID
{id:2, name:"Mary May", age:"1", gender:"female", profesorId:"6"},
];在Tabulator的列定义中,我们需要为目标列(例如“Profesor”)进行以下配置:
var table = new Tabulator("#example-table", {
data: tableData, // 设置初始表格数据
columns: [
{title: "Name", field: "name"},
{title: "Age", field: "age"},
{title: "Gender", field: "gender"},
{
title: "Profesor",
width: 200,
field: "profesorId", // 存储ID的字段
editor: "select", // 使用select编辑器
editorParams: {
values: teacherList // 编辑器显示这些选项
},
formatter: function(cell, formatterParams, onRendered) {
const value = cell.getValue(); // 获取单元格存储的ID
if (value) {
// 从teacherList中查找匹配ID的标签
const teacher = teacherList.find(obj => obj.value == value);
return teacher ? teacher.label : ""; // 如果找到,返回标签;否则返回空字符串
} else {
return ""; // 如果没有值,显示为空
}
}
},
],
});cellEdited事件在单元格数据被修改并保存后触发。重要的是,通过上述配置,cell.getValue()在cellEdited事件中将返回我们期望的ID,而不是显示的标签。这使得我们可以方便地使用这个ID进行后续的业务逻辑处理,例如发送AJAX请求。
table.on("cellEdited", function(cell){
// cell - 单元格组件
var rowId = cell.getRow().getData().id; // 获取行ID
var columnField = cell.getColumn().getField(); // 获取被编辑的列字段名
var cellValue = cell.getValue(); // 获取单元格的新值 (这里是教授的ID)
console.log(`行ID: ${rowId}, 列: ${columnField}, 新值 (ID): ${cellValue}`);
// 此时,cellValue就是教授的ID,可以用于AJAX查询
// 例如:
// fetch(`/api/updateProfessor?rowId=${rowId}&profesorId=${cellValue}`)
// .then(response => response.json())
// .then(data => console.log("更新成功", data))
// .catch(error => console.error("更新失败", error));
});通过将Tabulator的editor配置为存储ID,并结合自定义的formatter来显示对应的标签,我们成功地实现了数据存储的精确性与用户界面的友好性之间的平衡。这种模式是处理具有关联ID和显示文本的数据的强大且灵活的方法,广泛适用于各种下拉选择器场景。理解并运用editor和formatter的职责分离,是Tabulator高级应用中的一项基本技能。
以上就是Tabulator列表编辑器:实现值与显示分离的策略的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号