动态表是如何保存的?
李小翔
2013-11-25 08:20

内容列表

供稿人：杨帅军
新员工进入公司以后都会做一个流程来了解产品特性，对于表单上的东西最好奇的就属动态表啦！下面来看一下动态表是如何保存的！
1、使用动态表必须在页面上添加这样一句话
var dynaTable = DynamicTable(tableId, templateTrId, checkboxName, lastReservedRowCount, childClass, requiredField);
示例：
// 创建一个动态表对象，其中：
// 表格的ID为 dynaTable
// 模板行的ID为 moban
// 复选框的名称为 ind.id，同时指定了动态表里所有字段名称都统一使用前缀 “ind.” 提交
// 最下面需要保留的行（如合计行）数为 0
// 动态表对应的子类（hasMany）名称为 EmployeeKPIPlanInd
// 保存时，必填字段的名称为 sortorder，如果该字段为空，则这条数据会被自动抛弃
var dynaTable = new DynamicTable(”dynaTable”, ”moban”, ”ind.id”, 0, ”EmployeeKPIPlanInd”, ”sortorder”); 
然后配合后台的控制器使用：
// 手动保存动态表
updateDynamicTable(employeeKPIPlanInstance, EmployeeKPIPlanInd, ”inds”, ”plan”, params, ”ind”, ”sortorder”);
// 或自动保存所有动态表
updateDynamicTables(employeeKPIPlanInstance, params);
2、下面的js代码除提供添加一行和删除一行功能外最主要的是自动生成三个隐藏字段。
js代码如下：
new DynamicTable(”dynaTable”, ”moban”, ”ind.id”, 0, ”EmployeeKPIPlan”, ”sortorder”); 
隐藏字段如下：
$j(dt.table).append(”<input type=’hidden’ name=’”+prefix+”DynamicTable’ value=’1’/>”);
$j(dt.table).append(”<input type=’hidden’ name=’”+prefix+”DynamicTableChildClass’ value=’” + dt.options.childClass + ”’/>”);
$j(dt.table).append(”<input type=’hidden’ name=’”+prefix+”DynamicTableRequiredField’ value=’” + dt.options.requiredField + ”’/>”);
3、控制器中 updateDynamicTable 或 updateDynamicTables 主要负责根据类名实例化对象实例再进行初始化，这两个方法位于 bropen.toolkit.utils.grails.BeanUtils 中。
以手动保存动态表为例，updateDynamicTable 的主要逻辑如下：
1). 构造明细
2). 利用反射根据类名获取类的实例
3). 从数据库删除被删除的明细
4). 将剩余的明细赋给主类bean
注：自动保存动态表实际在调手动保存动态表
4、除此之外，动态表还提供前后台的事件机制、编辑部分数据（如张三编辑1、3、5行、李四同时编辑2、4、6行）等机制。
总结：
如果子表的数据在create时，已经创建，且不再需要添加或删除一行，而又需要用到动态表的自动保存功能，只需在页面上添加必要的隐藏域字段即可，其中 ind 为动态表前缀：
<input type=”hidden” value=”1” name=”indDynamicTable”>
<input type=”hidden” value=”EmployeeKPIPlanInd” name=”indDynamicTableChildClass”>
<input type=”hidden” value=”sortorder” name=”indDynamicTableRequiredField”>