/** * 添加子表行 * @param subTabName * @param rowData */ function addSubTabRow(subTabName, rowData) { //获取对应的子表 var elementName = "#subtable\\|" + subTabName; var subTab = $(elementName); if (subTab.length = 0) { return; } //获取模板列变量 var templateHtml = window["templateHtml_" + subTabName]; if (!templateHtml) { return; } var newRow = $(templateHtml); var index = $(elementName + " tr.datarow").length + 1; //把行数据放到元素的数据中去 newRow.data("rowData", rowData); //如果有序号字段,则生成序号 if (newRow.children("td.serial")) { newRow.children("td.serial").html(index); } if (rowData) { var props = Object.getOwnPropertyNames(rowData); for (var i = 0; i < props.length; i++) { var prop = props[i]; var elmName = "subtable|" + subTabName + "|" + prop; var elms = $(newRow).find("[name='" + elmName + "']"); if (elms.length > 0) { $(elms[0]).val(rowData[prop]); } //查找是否有标签 var elmLabelName = "subtable|" + subTabName + "|" + prop + "|label"; var elmLabels = $(newRow).find("[name='" + elmLabelName + "']"); if (elmLabels.length > 0) { $(elmLabels[0]).html(rowData[prop]); } } } //将新行添加到子表中 newRow.appendTo(elementName + " tbody"); //解析新添加的行 $.parser.parse(elementName); } function updateSubTabRowDatas(subTabName, newRowDatas, keyField) { //读取原有的rowDatas var rowDatas = getSubTabRowDatas(subTabName); //循环新数据,看是否需要添加进来 for (var index in newRowDatas) { var isExists = false; for (var n = 0; n < rowDatas.length; n++) { if (rowDatas[n] && rowDatas[n][keyField] != "" && rowDatas[n][keyField] == newRowDatas[index][keyField]) { isExists = true; break; } } if (!isExists) { addSubTabRow(subTabName, newRowDatas[index]); } } //循环老数据,看是否需要删除 for (var n = rowDatas.length - 1; n >= 0; n--) { var isExists = false; if (rowDatas[n]) { for (var index in newRowDatas) { if (rowDatas[n][keyField] != "" && rowDatas[n][keyField] == newRowDatas[index][keyField]) { isExists = true; break; } } } if (!isExists) { removeSubTabRowByIndex(subTabName, n); } } } //获取子表数据行的原始数据 function getSubTabRowDatas(subTabName) { var rowDatas = []; //获取对应的子表 var elementName = "#subtable\\|" + subTabName; var subTab = $(elementName); if (subTab.length = 0) { return rowDatas; } var trs = $(elementName + " tr.datarow"); for (var i = 0; i < trs.length; i++) { var tr = trs[i]; var rowData = $(tr).data("rowData"); //如果没有数据,则从字段中去读取 if (!rowData) { var inputs = $(tr).find("input"); if (inputs.length > 0) { rowData = new Object(); for (var n = 0; n < inputs.length; n++) { var input = inputs[n]; var inputName = $(input).attr("name"); if (inputName) { var nameArr = inputName.split("|"); if (nameArr.length == 3) { rowData[nameArr[2]] = $(input).val(); } } } } } rowDatas.push(rowData); } return rowDatas; } function removeSubTabRowByIndex(subTabName, index) { //获取对应的子表 var elementName = "#subtable\\|" + subTabName; var tr = $(elementName + " tr.datarow:eq(" + index + ")"); if (tr.length > 0) { removeSubTabRow(tr[0]); } } /** * 删除子表行 * @param obj */ function removeSubTabRow(obj) { var tr = $(obj).closest("tr"); var table = $(obj).closest("table"); if (tr.length == 0 && table.length == 0) { return; } //判断是否有ID,有ID则说明在数据库中,需要添加到待删除列表 var tableIdName = $(table).attr("id"); var idElemName = tableIdName + "|id"; var idElem = $(tr).find("[name='" + idElemName + "']"); if (idElem.length > 0) { id = $(idElem[0]).val(); if (id != "") { var waitDeleteIdsElem = $("[name='" + tableIdName + "|waitDeleteIds'"); if (waitDeleteIdsElem.length > 0) { var waitDeleteIds = $(waitDeleteIdsElem[0]).val(); if (waitDeleteIds != "") { waitDeleteIds += ","; } waitDeleteIds += id; $(waitDeleteIdsElem[0]).val(waitDeleteIds); } } } //删除行 $(tr).remove(); //如果有序号行,则重新生成序号 var serialCols = $(table).find("td.serial"); if (serialCols.length > 0) { $(serialCols).each(function (index, val) { $(val).html(index + 1); }); } } /** * 处理表单数据中的子表数据(将子表数据转换为对象) * @param formData */ function dealSubTabData(formData) { var propertys = Object.getOwnPropertyNames(formData); for (var i = 0, len = propertys.length; i < len; i++) { var prop = propertys[i]; if (prop.indexOf("subtable|") == 0) { var parts = prop.split('|'); if (parts.length == 3) { var subTabName = parts[1]; var fieldName = parts[2]; if (!formData.hasOwnProperty("subTabItems")) { formData.subTabItems = new Object(); } if (!formData.subTabItems.hasOwnProperty(subTabName)) { formData.subTabItems[subTabName] = new Object(); formData.subTabItems[subTabName].items = new Array(); formData.subTabItems[subTabName].waitDeleteIds = ""; } if (fieldName == "waitDeleteIds") { formData.subTabItems[subTabName].waitDeleteIds = formData[prop]; } else { if (Array.isArray(formData[prop])) { for (var j = 0, n = formData[prop].length; j < n; j++) { if (!formData.subTabItems[subTabName].items[j]) { formData.subTabItems[subTabName].items[j] = new Object(); } formData.subTabItems[subTabName].items[j][fieldName] = formData[prop][j]; } } else { if (!formData.subTabItems[subTabName].items[0]) { formData.subTabItems[subTabName].items[0] = new Object(); } formData.subTabItems[subTabName].items[0][fieldName] = formData[prop]; } } } delete formData[prop]; } } //清理所有字段都为空的数据 if (formData.hasOwnProperty("subTabItems")) { var subTabNames = Object.getOwnPropertyNames(formData.subTabItems); for (var n = 0, len = subTabNames.length; n < len; n++) { var subTabName = subTabNames[n]; //倒序清理,因为要删除数组元素 for (var p = formData.subTabItems[subTabName].items.length - 1; p >= 0; p--) { var item = formData.subTabItems[subTabName].items[p]; var isEmpty = true; var propertys = Object.getOwnPropertyNames(item); for (j = 0; j < propertys.length; j++) { var prop = propertys[j]; //如果有一个属性不为空,则跳出 if (item[prop] && item[prop] != "") { isEmpty = false; break; } } //如果都为空,则删除该条数据 if (isEmpty) { delete formData.subTabItems[subTabName].items.splice(p, 1); } } //如果该子表没有有效数据,且没有删除的数据,则把该子表信息一起删除 if (formData.subTabItems[subTabName].items.length == 0 && formData.subTabItems[subTabName].waitDeleteIds == "") { delete formData.subTabItems[subTabName]; } } } }