84669 personnes étudient
152542 personnes étudient
20005 personnes étudient
5487 personnes étudient
7821 personnes étudient
359900 personnes étudient
3350 personnes étudient
180660 personnes étudient
48569 personnes étudient
18603 personnes étudient
40936 personnes étudient
1549 personnes étudient
1183 personnes étudient
32909 personnes étudient
现有一个需求,已知能够从后台获取到json数据,现在要根据数据中的值动态解析成页面控件,不同的数据类型要解析成不同的表单控件,而数据不会告诉你具体用什么类型的控件。要实现的话难道只能js判断,动态拼接dom?
认证0级讲师
1, 数据肯定有一个特征值来确定使用什么类型的组件,通过 js 进行判断有什么不好?数据本身是没有逻辑的2, 判断之后可以使用动态拼接,但是如果无法保证数据的安全性的话,最好使用模版引擎,比如 handlerbars 或者 ejs 之类的
js
handlerbars
ejs
你都说了啊,用js 判断数据类型
值有多少种可能性就预先做好多少种控件,然后动态拼接吧
动态拼接dom 不可取。可以用模板引擎, hbs,ejs jade 等等。 服务器还需要传给前端一份 数据结构,数据结构和返回的 json 对应,标明数据格式
楼主可以把从后台获取到的json数据的基本格式发一下吗
后端返回给你的数据中应该有字段来表述其属于哪种数据类型,那么我们根据不同的数据类型来生成相应的dom即可,但是在js中拼接字符串又是一件很坑底的事情,javascript的几种使用多行字符串的方式
如果觉得拼接字符串很麻烦,我们可以借助模版引擎例如nunjucks、 swig等来完成
<p id="app"></p> <script> var conf = { 'sex': 'radio', 'city': 'select' }; var extra = { 'sex': [ { k: '1', v: '男' }, { k: '2', v: '女' } ], 'city': [ { k: '1', v: '北京' }, { k: '2', v: '上海' } ] }; var data = { "id": "1", "sex": "2", "city": "2" }; function render(type, key, value, ext) { // radio/checkbox if (type == 'radio' || type == 'checkbox') { return renderCheckbox(key, value, ext, type); } // select if (type == 'select') { return renderSelect(key, value, ext); } // text return renderText(key, value); } function renderText(key, value) { var $input = $('<input type="text" />'); $input .attr('name', key) .attr('placeholder', key) .attr('title', key) .val(value); return $input; } function renderCheckbox(key, value, ext, type) { var ret = []; if (ext) { $.each(ext, function (idx, val) { var k = val.k; var v = val.v; ret.push( $('<input />') .attr('type', type) .attr('name', key) .attr('placeholder', key) .attr('title', key) .prop('checked', k == value) .val(k) , v ); }); return ret; } ret.push( $('<input />') .attr('type', type) .attr('name', key) .attr('placeholder', key) .attr('title', key) .prop('checked', !!value.length) .val(value) ); return ret; } function renderSelect(key, value, ext) { var $select = $('<select></select>') .attr('name', key) .attr('title', key); $select.append('<option value="">请选择<option'); $.each(ext, function (idx, val) { var k = val.k; var v = val.v; $select.append( $('<option><option') .text(v) .val(k) .prop('selected', k == value) ) }); return $select; } $.each(data, function (key, value) { var type = conf[key] || 'text'; var ext = extra[key]; $('#app').append(render(type, key, value, ext)) }) </script>
数字 -> input[typ='number']字符串 -> input[type='text']字符串有@ -> input[type='email']
这种方案自己被坑过,上手就放弃了;单不说服务器返回的数据,可不可以做到那么纯净;就是往服务器上上传,客户端一份校验、服务器上一份校验就已经要人命了;当时没办法,程序员就认定这条路了,只好变通一下,json数据分成两段,一段数据,一段DOM模板~
为何不在后端入手,直接给你传一个type值,给你定义好对应的类型呢,前端拿到json再去做判断,去解析远不如后端返回json时加个type值更快捷。
1, 数据肯定有一个特征值来确定使用什么类型的组件,通过
js
进行判断有什么不好?数据本身是没有逻辑的2, 判断之后可以使用动态拼接,但是如果无法保证数据的安全性的话,最好使用模版引擎,比如
handlerbars
或者ejs
之类的你都说了啊,用js 判断数据类型
值有多少种可能性就预先做好多少种控件,然后动态拼接吧
动态拼接dom 不可取。可以用模板引擎, hbs,ejs jade 等等。 服务器还需要传给前端一份 数据结构,数据结构和返回的 json 对应,标明数据格式
楼主可以把从后台获取到的json数据的基本格式发一下吗
后端返回给你的数据中应该有字段来表述其属于哪种数据类型,那么我们根据不同的数据类型来生成相应的dom即可,但是在js中拼接字符串又是一件很坑底的事情,javascript的几种使用多行字符串的方式
如果觉得拼接字符串很麻烦,我们可以借助模版引擎例如nunjucks、 swig等来完成
数字 -> input[typ='number']
字符串 -> input[type='text']
字符串有@ -> input[type='email']
这种方案自己被坑过,上手就放弃了;单不说服务器返回的数据,可不可以做到那么纯净;就是往服务器上上传,客户端一份校验、服务器上一份校验就已经要人命了;
当时没办法,程序员就认定这条路了,只好变通一下,json数据分成两段,一段数据,一段DOM模板~
为何不在后端入手,直接给你传一个type值,给你定义好对应的类型呢,前端拿到json再去做判断,去解析远不如后端返回json时加个type值更快捷。