/*!
* aform v1.5.1
* Copyright 2015, xiehuiqi
* Date: 2016年6月27日
*/
(function() {
//若已存在,则使用之前存在的版本
if (window.AForm) {
if (typeof module === "object" && module.exports) {
module.exports = window.AForm;
}
return window.AForm;
}
/** 常量 */
var AFORM_SYS_PLUGIN = "__AFORM_SYS_PLUGIN__";
var AFORM_BASIC_PLUGIN = "__AFORM_BASIC_PLUGIN__";
var AFORM_HTML_INPUT = "__AFORM_HTML_INPUT__";
var AFORM_OBJ_PLUGIN = "__AFORM_OBJ_PLUGIN__";
var AFORM_ARR_PLUGIN = "__AFORM_ARR_PLUGIN__";
var AFORM_ARR_ROW_PLUGIN = "__AFORM_ARR_ROW_PLUGIN__";
var controlInstance = {};
var aformInstance = {};//aform实例
var basicControl;
var htmlInputControl;
var objControl;
var arrControl;
var rowControl;
var sysControl;
/** 已渲染数据 */
AForm.renderCount = 0;//已渲染的控件数
AForm.formCount = 0;//已生成的实例数
/** 外部插件容器 */
AForm.Plugin = {};
AForm.Plugin.control = {};//控件
AForm.Plugin.validator = {};//验证器
AForm.Plugin.adapter = {};//适配器
AForm.Plugin.prop = {};//自定义属性
/** 全局配紫红 */
AForm.Config = {};
AForm.Config.defaultDelimiter = ",";//默认字符串分隔符,用于处理复选框的逗号隔开的值
/** 表格行操作 */
AForm.Config.defaultAction = {
"aform_array_add_row": {
html: "+"
},
"aform_array_delete_row": {
html: "×"
}
};
/** 标签 */
AForm.Config.tags = {
"basicContainer": "div",//div
"objectContainer": "fieldset",
"label": "label", //label
"controlContainer": "" //默认为空
};
/** 额外样式名 */
AForm.Config.extClassName = {
"basicContainer": "",//form-group
"label": "",
"table": "",//table table-bordered
"control": "",//form-control
"controlContainer": ""
};
/** 模板 */
AForm.Config.tpl = {
"tips": " [?]",
"thTips": "[?]"
};
/** 文案 */
AForm.Config.wording = {
"numText": "NO.",
"addRowText": "增加",//增加
"oprText": "操作",//操作
"deleteText": "删除",//操作
"labelColon": ":", //:
"fieldEmpty": "字段[{label}]不能为空",
"fieldInvalid": "字段[{label}]非法"
};
/** 处理函数 */
AForm.Config.fn = {
"showTips": function(input, errMsg) {
alert(errMsg);
},
"hideTips": function(input) {
_debug(input.name + " value is valid");
},
"onEmpty": function(input, conf) {
var name = input.getAttribute("name");
var errMsg = conf ? _h.words("fieldEmpty", {label: conf.label}) : input.title;
if (!errMsg) {
errMsg = _h.words("fieldEmpty", {label: input.getAttribute("name")});
}
AForm.Config.fn.showTips(input, errMsg);
},
"onInvalid": function(input, conf, errorMsg) {
var errMsg = errorMsg ? errorMsg : (conf ? _h.words("fieldInvalid", {label: conf.label}) : input.title);
if (!errMsg) {
errMsg = _h.words("fieldInvalid", {label: input.getAttribute("name")})
}
AForm.Config.fn.showTips(input, errMsg);
if (typeof input.focus === "function" || typeof input.focus === "object") {
input.focus();
}
},
"onValid": function(input, conf) {
AForm.Config.fn.hideTips(input);
},
"onGlobalInvalid": function(msg) {
alert(msg);
}
};
//初始化事件
var validateEvt = {
empty: function() {
AForm.Config.fn.onEmpty.apply(AForm, arguments);
},
invalid: function() {
AForm.Config.fn.onInvalid.apply(AForm, arguments);
},
valid: function() {
AForm.Config.fn.onValid.apply(AForm, arguments);
},
globalInvalid: function() {
AForm.Config.fn.onGlobalInvalid.apply(AForm, arguments);
}
};
//helper
var _formHelper = {
$: function(id) {
return document.getElementById(id);
},
stringTemplate: function(template, vars) {
return template.replace(/\{(\w+)\}/, function(s, v) {
return vars[v]
});
},
words: function(key, vars) {
return _h.stringTemplate(AForm.Config.wording[key], vars);
},
toArray: function(s) {
try {
return Array.prototype.slice.call(s);//ie8报错,见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice#Streamlining_cross-browser_behavior
} catch (e) {
var arr = [];
for (var i = 0, len = s.length; i < len; i++) {
arr[i] = s[i];
}
return arr;
}
},
indexOf: function(arr, fn) {
var pos = -1;
_h.each(arr, function(item, i) {
if (fn(item)) {
pos = i;
return false;
}
});
return pos;
},
isIE: function() {
var myNav = navigator.userAgent.toLowerCase();
return (myNav.indexOf('msie') != -1) ? parseInt(myNav.split('msie')[1]) : false;
},
getInput: function(domEle, restrict) {
if (_h.hasClass(domEle, "json-field-plugin")) {
restrict = false;//若是外部自定义控件,有可能并不会在html上打上data-gen=aform的标记,因此需要设置严格模式为false
}
var controlList = [];
var ips = _h.toArray(domEle.getElementsByTagName("input"));
var txts = _h.toArray(domEle.getElementsByTagName("textarea"));
var sels = _h.toArray(domEle.getElementsByTagName("select"));
var clTemp = ips.concat(txts).concat(sels);
for (var ii = 0; ii < clTemp.length; ii++) {
var ip = clTemp[ii];
//忽略的控件无需取值
//严格模式下,非aform生成的input无需取值
if (_h.isIgnore(ip) || (restrict && ip.getAttribute("data-gen") != "aform")) {
} else {
controlList.push(ip);
}
}
return controlList;
},
removeArray: function(arr, fn) {
if(_h.getObjType(arr) !== "Array")return;
var pos = _h.indexOf(arr, fn);
if (pos > -1) {
arr.splice(pos, 1);
}
},
hasClass: function(ele, clsName) {
if (!ele || !ele.nodeType == 1) {
return false;
}
return (" " + ele.className).indexOf(" " + clsName) > -1;
},
isFormElement: function(ele) {
var isEle = _h.hasClass(ele, "json-form-element") || _h.hasClass(ele, "json-field-plugin");
return isEle && !_h.isIgnore(ele);
},
isIgnore: function(ele) {
if (!ele || !ele.getAttribute) {
return false;
}
return ele.getAttribute("ignore") == "true" || ele.getAttribute("ignore") == "ignore";
},
addClass: function(ele, clsName) {
if (!ele || !clsName) {
return false;
}
if (!ele.className) {
ele.className = clsName;
}
else if (!_formHelper.hasClass(ele, clsName)) {
ele.className += " " + clsName;
}
},
validateInput: function(input, conf, af)//用于验证输入控件的value
{
var v = input.value;
return validateInput(af, input, v, conf);
},
getParent: function(ele, ptag) {
ptag = ptag.toUpperCase();
var p = ele.parentNode;
while (p && p.tagName != ptag) {
p = p.parentNode;
}
return p;
},
getNextSibling: function(n) {
var x = n.nextSibling;
while (x && x.nodeType != 1) {
x = x.nextSibling;
}
return x;
},
showNextSibling: function(ele, visible) {
var n = this.getNextSibling(ele);
while (n) {
var isHidden = n.getAttribute("hidden") != null;//兼容html5的hidden属性
n.style.display = isHidden ? "none" : (visible ? "" : "none");
n = this.getNextSibling(n);
}
},
getTarget: function(e) {
e = e || window.event;
return e.target || e.srcElement;
},
addEvent: function(ele, evt, fn) {
if (ele.attachEvent) {
return ele.attachEvent('on' + evt, fn);
}
else {
return ele.addEventListener(evt, fn, false);
}
},
exeCmd: function(e, tbid, rowAction, fnBefore, fnAfter, afObj) {
var target = _h.getTarget(e);
var cmd = target.getAttribute("cmd");
if (!cmd) {
return false;
}
var table = _formHelper.getParent(target, "table");
//重要,如果事件源table存在事件绑定,但当前触发的事件函数源却不是该table,则是冒泡带上的事件,忽略之,防止触发两次
if (table && table.id != tbid) {
return false;
}
var row = _formHelper.getParent(target, "tr");
if (cmd == "aform_array_collapse_table") {//隐藏table
var show = true;
if (_formHelper.hasClass(target, "json-form-ctrl-un-collapse")) {
target.className =
target.className.replace("json-form-ctrl-un-collapse", "json-form-ctrl-collapse");
show = false;//需要折叠
} else if (_formHelper.hasClass(target, "json-form-ctrl-collapse")) {
target.className =
target.className.replace("json-form-ctrl-collapse", "json-form-ctrl-un-collapse");
}
_formHelper.showNextSibling(_formHelper.getParent(target, "caption"), show);
_formHelper.showNextSibling(target, show);
} else if (cmd == "aform_array_collapse_fieldset") {
var show = true;
if (_formHelper.hasClass(target, "json-form-ctrl-un-collapse")) {
target.className =
target.className.replace("json-form-ctrl-un-collapse", "json-form-ctrl-collapse");
show = false;
} else if (_formHelper.hasClass(target, "json-form-ctrl-collapse")) {
target.className =
target.className.replace("json-form-ctrl-collapse", "json-form-ctrl-un-collapse");
}
_formHelper.showNextSibling(_formHelper.getParent(target, "legend"), show);
} else if (cmd == "aform_array_add_row") {//默认添加行为
(_joinFunction(fnBefore, window, ["aform_array_add_row", table]) !== false) &&
_formHelper.addRow(table, afObj);
_joinFunction(fnAfter, window, ["aform_array_add_row", table]);//after
} else if (cmd == "aform_array_delete_row") {//默认删除行的行为
if (!table) {
return false;
}
if (fnBefore.length) {
(_joinFunction(fnBefore, window, ["aform_array_delete_row", row]) !== false) &&
_formHelper.removeRow(row);
}
else {
if (!confirm("确定删除该行吗?")) {
return false;
}
_formHelper.removeRow(row);
}
_joinFunction(fnAfter, window, ["aform_array_delete_row", row, table]);//after
} else {//执行自定义的
for (var icmd in rowAction) {
var item = rowAction[icmd];
if (icmd == cmd && typeof item.handler == "function") {
var ret = true;
if (fnBefore.length) {
ret = _joinFunction(fnBefore, window, [icmd, row, table]);
}
ret && item.handler(row, table, icmd);
_joinFunction(fnAfter, window, [icmd, row, table]);//after
break;
}
}
}
},
isObjEmpty: function(obj) {
if (!obj || obj.length) {
return true;
}//数组不合法,认为是空
for (var p in obj) {
return false;
}
return true;
},
isInArray: function(key, array) {
var i = array.length;
while (i--) {
if (key == array[i]) {
return true;
}
}
return false;
},
removeRow: function(row) {
var tbBody = row.parentNode;
if (tbBody.rows.length == 1 && !tbBody.tempRow)//若只有一行了,则存储该行为表格的临时行,用于下次表格新增行
{
row.cells[0].innerHTML = 0;//起始为0,addRow后,将自增1,之所以设置row的序号为0,而不是clone后再设置,是因为ie对于未在表格中的row取cell会报错
tbBody.tempRow = row.cloneNode(true);
}
tbBody.removeChild(row);
},
addRow: function(table, af) {
if (!table) {
return;
}
var jpath = table.getAttribute("jpath");
var fd = af.getConfigByPath(jpath);
if (!fd) {
return;
}
af.emit("beforeRender");
var newData = _genDefaultData(fd.fields) || "";
var curRowLength = table.rows.length == 0 ? 0 :
(_h.hasClass(table.rows[0], "aform-array-header") ? (table.rows.length - 1) : table.rows.length);
var newIndex = curRowLength;
var rowHtml = rowControl.render(newIndex, newData, fd, AForm.renderCount, af, jpath);
var tBody = table.tBodies[0];
if (!tBody) {
return false;
}
var tempDiv = document.createElement("div");
tempDiv.innerHTML = "
" + rowHtml + "
";
tBody.appendChild(tempDiv.getElementsByTagName("table")[0].rows[0]);
af.emit("renderComplete");
},
trim: function(s) {
if (typeof s != "string") {
return s;
}
if (s.trim) {
return s.trim();
}
else {
return s.replace(/(^\s+)|(\s+$)/g, "");
}
},
each: function(array, fn) {
var len = array.length;
for (var i = 0; i < len; i++) {
var ret = fn(array[i], i);
if (ret === false) {
break;
}
}
},
objEach: function(obj, fn) {
obj = obj || {};
for (var p in obj) {
if (!obj.hasOwnProperty(p)) {
continue;
}
if (fn(p, obj[p]) === false) {
break;
}
}
},
getObjType: function(obj) {
if (obj === undefined) {
return "undefined";
}
if (obj === null) {
return "null";
}
if (obj.constructor == Array) {
return "Array";
}
if (obj.constructor == Array) {
return "Array";
}
else if (obj.constructor == Object) {
return "Object";
}
else if (obj.constructor == Number) {
return "Number";
}
else if (obj.constructor == Boolean) {
return "Boolean";
}
else if (obj.constructor == String) {
return "String";
}
else {
return "unknow";
}
},
extend: function(obj, base) {
if (!obj) {
obj = {};
}
if (!base) {
return obj;
}
for (var p in base) {
obj[p] = base[p];
}
return obj;
},
obj2str: function(obj, sep) {
var arr = [];
for (var p in obj) {
arr.push(p + "=\"" + obj[p] + "\"");
}
return arr.join(sep || " ");
}
};
var _h = _formHelper;
//全局静态函数
/**
* @description 创建一个aform实例,和 new 结果一样
*/
AForm.create = function(arg1, arg2) {
return new AForm(arg1, arg2);
};
/**
* @description 根据表单id获取一个aform实例,和 new 结果一样
*/
AForm.get = function(id) {
return aformInstance[id];
};
/**
* @description 注册输入控件
* @param {String} name 控件名
* @param {Object} obj 被继承的控件名或控件定义
* @param {Object} obj2 控件定义,无继承时无该参数
*/
AForm.registerControl = function(name, obj, obj2) {
if (typeof name != "string") {
_debug("invalid control param");
return false;
}
//未使用继承
var proto;
if (typeof obj == "object") {
proto = obj;
} else if (typeof obj == "string") {
//使用了继承方式
var superName = obj;
if (!(superName in AForm.Plugin.control)) {
_debug(superName + " not exist");
return false;
}
var __super = AForm.Plugin.control[superName].prototype;
if (!__super) {
_debug(superName + " not exist");
return false;
}
var t = _h.extend({}, __super);
obj2 = _h.extend(t, obj2);
obj2.__super = __super;
proto = obj2;
}
AForm.Plugin.control[name] = function() {
};
AForm.Plugin.control[name].prototype = proto;
};
/**
* @description 注册自定义属性
* @param {String} name 属性名,多个用空格隔开
* @param {Object} obj 控件定义
*/
AForm.registerProp = function(name, obj) {
var name = name.split(/\s+/g);
_h.each(name, function(n) {
AForm.Plugin.prop[n] = obj;
})
};
/**
* @description 注册验证器
* @param {String} name 控件名
* @param {Object} obj 控件定义
*/
AForm.registerValidator = function(name, obj) {
AForm.Plugin.validator[name] = obj;
};
/**
* @description 注册适配器
* @param {String} name 控件名
* @param {Object} obj 控件定义
*/
AForm.registerAdapter = function(name, obj) {
AForm.Plugin.adapter[name] = obj;
};
//生成验证属性
function genValProp(name, v, fd, vfn, errorMsg) {
var tag = "_af_prop_" + name;
if(_h.getObjType(fd.validators) !== "Array")return;
_h.removeArray(fd.validators, function(item) {
return item._af_source = tag;
});
delete fd.ctrlAttr[name];
if (v) {
fd.ctrlAttr[name] = v;
(fd.validators.push({
rule: vfn,
_af_source: tag,
errorMsg: errorMsg
}
));
}
}
//基本属性的注册
AForm.registerProp("maxlength", {
beforeRender: function(propValue, propName, conf) {
genValProp(propName, propValue, conf, function(v) {
return v.length <= propValue;
}, "输入的字符长度需不大于" + propValue)
}
});
AForm.registerProp("max", {
beforeRender: function(propValue, propName, conf) {
genValProp(propName, propValue, conf, function(v) {
return v - 0 <= propValue - 0;
}, "输入的值需不大于" + propValue)
}
});
AForm.registerProp("min", {
beforeRender: function(propValue, propName, conf) {
genValProp(propName, propValue, conf, function(v) {
return v - 0 >= propValue - 0;
}, "输入的值需不小于" + propValue)
}
});
AForm.registerProp("minlength", {
beforeRender: function(propValue, propName, conf) {
genValProp(propName, propValue, conf, function(v) {
return v.length >= propValue;
}, "输入的字符长度需不少于" + propValue)
}
});
AForm.registerProp("readonly disabled pattern", {
beforeRender: function(r, prop, conf) {
if (r) {
conf.ctrlAttr[prop] = r;
} else {
delete conf.ctrlAttr[prop];
}
}
});
AForm.registerProp("size title placeholder", {
beforeRender: function(s, prop, conf) {
conf.ctrlAttr[prop] = s;
}
});
AForm.registerProp("multiple", {
beforeRender: function(multiple, prop, conf) {
(multiple && conf.type == "select") && (conf.ctrlAttr["multiple"] = "multiple");
}
});
AForm.registerProp("required", {
beforeRender: function(required, prop, conf) {
required && (conf.ctrlAttr["required"] = "required");
}
});
/* 注册基本渲染器 */
AForm.registerControl(AFORM_HTML_INPUT, {
desc: "AForm 基础渲染器",
render: function(nameOrIndex, input, fieldConfig, renderCount, afObj, jpath, hideLabel) {
return _FormElementFactory.generateInputHtml(nameOrIndex, input, fieldConfig, afObj);
},
getJsonPartString: function(domEle, fd, af) {
var controlList = _h.getInput(domEle, af.config.restrict);
//若仍然无控件,则返回空json
if (controlList.length == 0) {
return "\"\":null";
}
var l = controlList.length;
var fieldName = controlList[0].name;
var jpath = controlList[0].getAttribute("jpath") || domEle.getAttribute("jpath");
var conf = af.getConfigByPath(jpath);
var result = [];
if (fieldName)//若存在字段名,则设为key
{
result.push("\"" + fieldName + "\":");
}
//获取该字段的value
var values = [];
for (var i = 0; i < l; i++) {
var input = controlList[i];
var domType = input.type;
if (domType == "radio" || domType == "checkbox") {
if (!input.checked) {
continue;
}//未勾选,则忽略之,继续下一个input
}
if (domType == "select-multiple") {
var select = input;
var selen = select.length;
for (j = 0; j < selen; j++) {
if (select.options[j].selected) {
values.push(select.options[j].value);
}
}
}
else//文本输入框、radio、checobox等
{
if (conf.needOther) {//若设置了other选项
if (_h.hasClass(input, "aform-other-input")) {//若选中了other
if (values[values.length - 1] == "__other__") {
values[values.length - 1] = (_h.trim(input.value));
}
} else {
values.push(_h.trim(input.value));
}
} else {
values.push(_h.trim(input.value));
}
}
}
//处理为空情形
var tmpValue = values.join('');
validateInput(af, input, tmpValue, conf, controlList[0]);
//值适配器处理
var fnAdpt = function(v) {
return v;
};
if (conf.valueAdapter && typeof conf.valueAdapter.beforeGet == "function") {
fnAdpt = conf.valueAdapter.beforeGet;
}
//把处理后的值推入result
if (domEle.className.indexOf("json-Boolean") > -1) {
var tmp = fnAdpt(values.length > 0);
if (typeof tmp == "string") {
tmp = "\"" + tmp + "\"";
}
result.push(tmp);//若勾选即为true
}
else if (domEle.className.indexOf("json-Number") > -1) {
var len = values.length;
for (var i = 0; i < len; i++) {
values[i] -= 0;//转换为数字
}
result.push(fnAdpt(values.join(conf.delimiter || ',')));
}
else {// (domEle.className.indexOf("json-String") > -1) {
var len = values.length;
for (var i = 0; i < len; i++) {
//过滤不合法的bad control char
values[i] = _replaceBadControl(values[i]);
}
result.push('"');
result.push(fnAdpt(values.join(conf.delimiter || ",")));
result.push('"');
}
return result.join("");
}
});
htmlInputControl = new AForm.Plugin.control[AFORM_HTML_INPUT];
/* 注册基本渲染器 */
AForm.registerControl(AFORM_BASIC_PLUGIN, AFORM_HTML_INPUT, {
desc: "AForm 基础渲染器",
render: function(nameOrIndex, input, fieldConfig, renderCount, afObj, jpath, hideLabel) {
if (fieldConfig.jtype == "Number") {
return _FormElementFactory.createNumber(input, nameOrIndex, afObj.config, fieldConfig, hideLabel, afObj);
} else if (fieldConfig.jtype == "String") {
return _FormElementFactory.createString(input, nameOrIndex, afObj.config, fieldConfig, hideLabel, afObj);
} else if (fieldConfig.jtype == "Boolean") {
return _FormElementFactory.createBoolean(input, nameOrIndex, afObj.config, fieldConfig, hideLabel, afObj);
} else {
return _FormElementFactory.createString(input, nameOrIndex, afObj.config, fieldConfig, hideLabel, afObj);
}
}
});
basicControl = new AForm.Plugin.control[AFORM_BASIC_PLUGIN];
//注册数组行元素渲染器
AForm.registerControl(AFORM_ARR_ROW_PLUGIN, {
desc: "AForm arr渲染器",
render: function(i, input, fieldConfig, renderCount, afObj, jpath, hideLabel) {
var temp = [];
var curEle = input;
var isRegular = _h.getObjType(input) == "Object";//若第一个元素是Object,则当成元素是统一对象的规则数组
var eleType = _formHelper.getObjType(curEle);
var basicClass = _formHelper.isInArray(eleType, ['String', 'Number', 'Boolean']) ?
" json-basic-element" : "";
temp.push("
");
var attrIndexDisplay = fieldConfig.showArrayNO ? "" : "display:none";
if (isRegular) {
temp.push("
" + (i + 1) + "
");
//对字段排序
var keyArray = _sortObject(curEle, fieldConfig.fields);
//遍历排好序的字段
for (var ii = 0; ii < keyArray.length; ii++) {
var p = keyArray[ii];
var fieldConf = afObj.getConfigByPath(jpath + "[0]." + p);
if (fieldConf.noRender) {
continue;
}
temp.push("
");
temp.push(afObj.renderData(curEle, i, jpath + "[" + i + "]"));
temp.push("
");
}
//末尾的操作列
if (!_formHelper.isObjEmpty(fieldConfig.rowAction)) {
temp.push("
");
for (var cmd in fieldConfig.rowAction) {
var btn = fieldConfig.rowAction[cmd];
temp.push("");
temp.push(btn.html.replace(/<(\w)+\s*/g, "<$1 cmd='" + cmd + "' "));
temp.push("");
}
temp.push("
");
}
temp.push("
");
return temp.join("");
}
}
);
rowControl = new AForm.Plugin.control[AFORM_ARR_ROW_PLUGIN];
//注册数组渲染器
AForm.registerControl(AFORM_ARR_PLUGIN, {
desc: "AForm arr渲染器",
render: function(nameOrIndex, input, fieldConfig, renderCount, afObj, jpath, hideLabel) {
fieldConfig.rowAction = fieldConfig.rowAction || afObj.config.rowAction;
if (typeof nameOrIndex == "string") {
fieldConfig.attr["name"] = nameOrIndex;
}
//检测插件,插件优先
if (fieldConfig.type in AForm.Plugin.control) {
//插件用固定样式包裹
return _genPlugin(nameOrIndex, input, afObj, fieldConfig.type, fieldConfig, "", "div");
}
var tbId = fieldConfig.ctrlId || ("ele_json_tb_" + AForm.renderCount);
var me = afObj;
_eventSetter["click"][tbId] = function(e) {
_formHelper.exeCmd(e, tbId, fieldConfig.rowAction, me.eventArr.beforeExeCmd, me.eventArr.afterExeCmd, afObj);
};
var cssText = fieldConfig.cssText;
if (fieldConfig.hidden) {
cssText += ";display:none";
}
var temp = [];
temp.push(_s(fieldConfig.frontalHtml));
temp.push("
");
temp.push("
");
temp.push("");
if (!fieldConfig.noCreate)//若没禁止添加
{
var addRowText = afObj.config.addRowText || "+";
temp.push(" " + addRowText + " ");
}
if (fieldConfig.tips && !fieldConfig.noTips) {
temp.push(fieldConfig.tipsTpl.replace(/\{tips\}/g, fieldConfig.tips));
}
temp.push("
");
var len = input.length;
//当子元素是object时附加表格标题行
//若行数大于0且数组元素整齐,则提取标题
//当有字段时,或者第一个元素时对象时,说明数组元素是object,需生成表头
var isRegular = (!_h.isObjEmpty(fieldConfig.fields)) || (len > 0 && input[0].constructor == Object);//若第一个元素是Object,则当成元素是统一对象的规则数组
var attrIndexDisplay = fieldConfig.showArrayNO ? "" : "display:none";
if (fieldConfig.noDelete) {
delete fieldConfig.rowAction["aform_array_delete_row"];
}
if (fieldConfig.noCreate) {
delete fieldConfig.rowAction["aform_array_add_row"];
}
//仅数组元素为对象且没隐藏表头时才生成表头
if (isRegular) {
temp.push("
");
temp.push("
" + AForm.Config.wording.numText + "
");
var firstEle = _genDefaultData(fieldConfig.fields);
//对字段排序
var keyArray = _sortObject(firstEle, fieldConfig.fields);
//遍历排好序的字段
for (var i = 0; i < keyArray.length; i++) {
var k = keyArray[i];
var fieldConf = afObj.getConfigByPath(jpath + "[0]." + k);
if (fieldConf.noRender) {
continue;
}
temp.push("
");
temp.push(_FormElementFactory.getLabelText(fieldConf, k));
if (fieldConf && fieldConf.tips) {
var tipsTpl = afObj.config.thTipsTpl;//表头的提示
temp.push(tipsTpl.replace(/\{tips\}/g, fieldConf.tips));
}
temp.push("
");
}
//若操作行为大于0,则建立操作列
if (!_formHelper.isObjEmpty(fieldConfig.rowAction)) {
temp.push("
" + AForm.Config.wording.oprText + "
");
}
temp.push("
");
}
temp.push("");
//生成表格的行
for (var i = 0; i < len; i++) {
temp.push(rowControl.render(i, input[i], fieldConfig, renderCount, afObj, jpath));
}
temp.push("");
temp.push("