javascript - 自动解析数据生成不同表单的思路
PHP中文网
PHP中文网 2017-04-11 10:30:16
0
8
335

现有一个需求,已知能够从后台获取到json数据,现在要根据数据中的值动态解析成页面控件,不同的数据类型要解析成不同的表单控件,而数据不会告诉你具体用什么类型的控件。要实现的话难道只能js判断,动态拼接dom?

PHP中文网
PHP中文网

认证0级讲师

全部回复(8)
左手右手慢动作

1, 数据肯定有一个特征值来确定使用什么类型的组件,通过 js 进行判断有什么不好?数据本身是没有逻辑的
2, 判断之后可以使用动态拼接,但是如果无法保证数据的安全性的话,最好使用模版引擎,比如 handlerbars 或者 ejs 之类的

PHPzhong

你都说了啊,用js 判断数据类型

巴扎黑

值有多少种可能性就预先做好多少种控件,然后动态拼接吧

伊谢尔伦

动态拼接dom 不可取。可以用模板引擎, hbs,ejs jade 等等。 服务器还需要传给前端一份 数据结构,数据结构和返回的 json 对应,标明数据格式

PHPzhong

楼主可以把从后台获取到的json数据的基本格式发一下吗

  1. 后端返回给你的数据中应该有字段来表述其属于哪种数据类型,那么我们根据不同的数据类型来生成相应的dom即可,但是在js中拼接字符串又是一件很坑底的事情,javascript的几种使用多行字符串的方式

  2. 如果觉得拼接字符串很麻烦,我们可以借助模版引擎例如nunjucks、 swig等来完成

PHPzhong
<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值更快捷。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!