问题:
有个页面用到了一维数组的键值组件,默认的键值组件有自带删除、拖动的功能,不希望客户进行删除和拖动,所以就需要自定义模板
然后就遇到了一个奇怪的问题:提交后对应textarea的值为空,在js里面获取,也变成了空数组。就算把require-form.js里面的fieldlisttpl直接拷贝过来用也是不行。
require-form.js里面代码
config: {
fieldlisttpl: '<dd class="form-inline"><input type="text" name="<%=name%>[<%=index%>][key]" class="form-control" value="<%=key%>" placeholder="<%=options.keyPlaceholder||\'\'%>" size="10" /> <input type="text" name="<%=name%>[<%=index%>][value]" class="form-control" value="<%=value%>" placeholder="<%=options.valuePlaceholder||\'\'%>" /> <span class="btn btn-sm btn-danger btn-remove"><i class="fa fa-times"></i></span> <span class="btn btn-sm btn-primary btn-dragsort"><i class="fa fa-arrows"></i></span></dd>'
}
经过一步步排查才发现,原来是在require-form.js的324行处有一个判断,如果定义了自定义模板,就默认当成是二维数组,导致赋值的时候变成了空数组
var refresh = function (container) {
var data = {};
var name = container.data("name");
var textarea = $("textarea[name='" + name + "']", form);
var template = container.data("template");
$.each($("input,select,textarea", container).serializeArray(), function (i, j) {
var reg = /\[(\w+)\]\[(\w+)\]$/g;
var match = reg.exec(j.name);
if (!match)
return true;
match[1] = "x" + parseInt(match[1]);
if (typeof data[match[1]] == 'undefined') {
data[match[1]] = {};
}
data[match[1]][match[2]] = j.value;
});
var result = template ? [] : {};// 就是这一行判断
$.each(data, function (i, j) {
if (j) {
var keys = Object.keys(j);
if (keys.indexOf("value") > -1 && (keys.length === 1 || (keys.length === 2 && keys.indexOf("key") > -1))) {
if (keys.length === 2) {
if (j.key != '') {
result['__PLACEHOLDKEY__' + j.key] = j.value;
}
} else {
result.push(j.value);
}
} else {
result.push(j);
}
}
});
textarea.val(JSON.stringify(result).replace(/__PLACEHOLDKEY__/g, ''));
};
不想为了这个小功能去改动require-form.js,就用了个简单的方法绕过去了
直接在js里面把2个按钮给隐藏了
$(document).on("fa.event.refreshfieldlist", '.fieldlist', function(e, obj){
$(".fieldlist .btn-remove, .fieldlist .btn-dragsort").hide();
});