在前两篇笔记中波波记录了基于Layui自定义表单的实现,但是页面自定义表单的数据如何保存,以及在保存自定义表单数据后,如何在第二次打开页面时还原自定义的表单?
这里波波的思路是,自定义表单的数据采用JSON的格式保存成一条数据。页面在重新载入时根据保存的JSON数据还原表单。
首先我们在页面保存数据的JS代码片段:
- //点击save按钮时将自定义表单区域的值保存到extra中
- $("#sav").on('click',function () {
- var ext = {};
- var i = 0;
- $("#extra_attr").find("input[class='layui-input']").each(function () {
- var d = {};
- d['title'] = $(this).parent().parent().find("label").text();
- d['type'] = $(this).attr('cate');
- d['name'] = $(this).attr('name');
- d['value'] = $(this).val();
- ext[i] = d;
- i++;
- })
- $("#extra").val(JSON.stringify(ext));
- });
保存数据示例如下。
- //{"0":{"title":"字段1","type":"numbers","name":"eng","value":"0.01"},"1":{"title":"字段2","type":"text","name":"dict","value":"ee"}}
在还原表单时,我们会根据上述JSON创建Form表单的HTML代码。
- //初始化页面,自动创建自定义属性的表单
- $(document).ready(function () {
- createElementByJson("extra_attr",$("#extra").val());
- });
下面代码是根据Json创建Form表单的核心代码。大家可以复制后保存成单独的JS文件。
- /*
- *根据Json创建Form表单
- * i:元素ID;s:Json数据
- * 页面需加载Jquery库
- * Created By BoBo 2021
- */
- function createElementByJson(i,s) {
- console.log("初始化表单开始...");
- if('' == s){
- console.log('Json字符不能为空');
- }
- var tpl='';
- $.each(JSON.parse(s),function (index,data) {
- tpl += getFormTpl(data.type,data.title,data.name,data.value);
- })
- //return data;
- $(tpl).hide().appendTo($('#'+i)).fadeIn('slow');
- //如果页面注册有Form组件,否则必须注释掉;
- window.form.render();
- }
- //获取Form模板
- function getFormTpl(type,input_title,input_name,input_val=''){
- var data = '';
- var tpl = "$(this).prev('img').attr('src', this.value)";
- var tpl_del = '<div class="layui-form-mid layui-word-aux">\n' +
- ' <button type="button" class="layui-btn layui-btn-primary layui-btn-xs delete"><i class="fa fa-close"></i></button>\n' +
- ' </div>';
- var tpl_img = '<div class="layui-form-item">\n' +
- ' <label class="layui-form-label">'+ input_title +'</label>\n' +
- ' <div class="layui-input-block">\n' +
- ' <div class="layui-input-inline">\n'+
- ' <img data-tips-image style="height:auto;max-height:100px;min-width:100px" src="/static/theme/default/img/image.png"/>\n' +
- ' <input type="hidden" name="' + input_name + '" onchange="'+ tpl +'"\n' +
- ' value="'+ input_val +'" class="layui-input" cate="images">\n' +
- ' <button class="layui-btn layui-btn-sm" data-file="one" data-type="jpg,png,gif" data-field="' + input_name + '" type="button">上传</button>\n' +
- ' </div>\n'+
- ' </div>\n' +tpl_del+
- ' </div>';
- var tpl_file = '<div class="layui-form-item">\n' +
- ' <label class="layui-form-label">'+ input_title +'</label>\n' +
- ' <div class="layui-input-block" style="min-height: 0px">\n' +
- ' <div class="layui-input-inline" style="width: 300px">\n' +
- ' <input class="layui-input" name="' + input_name + '" placeholder="请上传附件..." value="'+ input_val +'" cate="files">\n' +
- ' </div>\n' +
- ' <div class="layui-input-inline">\n' +
- ' <button type="button" class="layui-btn layui-btn-small layui-btn-radius" data-file="one" data-type="doc,ppt,txt,docx,pptx,zip" data-uptype="local" data-field="' + input_name + '">\n' +
- ' <i class="fa fa-cloud-upload"></i>上传\n' +
- ' </button>\n' +
- ' </div>\n' +
- ' </div>\n' +tpl_del+
- ' </div>';
- var tpl_text = '<div class="layui-form-item">\n' +
- ' <label class="layui-form-label">'+input_title+'</label>\n' +
- ' <div class="layui-input-inline">\n' +
- ' <input name="'+input_name+'" value="'+ input_val +'" class="layui-input" title="请输入中文或英文字母" pattern="^[u4E00-u9FA5A-Za-z0-9_]+$" cate="text">\n' +
- ' </div>\n' +tpl_del+
- ' </div>';
- var tpl_numandmoney = '<div class="layui-form-item">\n' +
- ' <label class="layui-form-label">'+input_title+'</label>\n' +
- ' <div class="layui-input-inline">\n' +
- ' <input name="'+input_name+'" type="text" value="'+ input_val +'" class="layui-input" title="请输入数字" pattern="(^[1-9]([0-9]+)?(\\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\\.[0-9]([0-9])?$)" cate="numbers">\n' +
- ' </div>\n' +tpl_del+
- ' </div>';
- var tpl_datetime = '<div class="layui-form-item">\n' +
- ' <label class="layui-form-label">'+input_title+'</label>\n' +
- ' <div class="layui-input-inline">\n' +
- ' <input name="'+input_name+'" type="datetime" value="'+ input_val +'" class="layui-input" title="格式:2021-02-02 15:30:00" pattern="^[1-9]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\\s+(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d$" cate="datetimes">\n' +
- ' </div>\n' +tpl_del+
- ' </div>';
- switch (type) {
- case "images":
- data = tpl_img;
- break;
- case "files":
- data = tpl_file;
- break;
- case "moneys":
- data = tpl_numandmoney;
- break;
- case "numbers":
- data = tpl_numandmoney;
- break;
- case "datetimes":
- data = tpl_datetime;
- break;
- default:
- data = tpl_text;
- break;
- }
- return data;
- }
关于Layui自定义表单的实现一共三篇笔记,分别解决自定义Form表单的一些细节问题。到这里Form表单的自定义DIY功能就全部结束了。记录下笔记,下次就不再造重复的轮子。
至于后端只需要在数据库表上增加一个字段,类型设置为“text”来保存JSON数据即可。