cascade.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. /**
  2. * 请求接口格式
  3. * {
  4. }
  5. */
  6. layui.define(['jquery', 'form', 'layer'], function (exports) {
  7. var $ = layui.jquery,
  8. form = layui.form,
  9. layer = layui.layer;
  10. var Class = function (obj) {
  11. var _this = this;
  12. _this.elem = obj.elem || 'body'; //级联容器
  13. _this.url = obj.url || {}; //级联接口
  14. _this.formParm = []; //表单参数名
  15. typeof obj.url == 'object' && ($.each(obj.url, function (key, value) {
  16. _this.formParm.push(key);
  17. }));
  18. _this.listParamName = obj.listParamName || {
  19. valueName: 'id',
  20. name: 'name'
  21. };
  22. _this.width = {};
  23. _this.placeholder = {};
  24. _this.box = $('body'); //子集容器
  25. _this.boxs = []; //所有子集
  26. _this.title = obj.title || null; //标题
  27. _this.hostParm = { //默认请求参数名
  28. idName: 'id',
  29. rowsName: 'limit'
  30. };
  31. _this.valObj = {}; //初始值对象
  32. _this[_this.hostParm['rowsName']] = obj[_this.hostParm['rowsName']] || 10000; //请求条数
  33. for (var i in obj.hostParm) { //自定义请求参数名
  34. _this.hostParm[i] = obj.hostParm[i];
  35. }
  36. _this.data = {}; //默认请求参数
  37. _this.data[_this.hostParm['rowsName']] = _this[_this.hostParm['rowsName']]; //赋值参数
  38. _this.verify = obj.verify || {};
  39. $.extend(this, obj);
  40. _this.init(); //初始化
  41. };
  42. /**
  43. *返回当前元素在数组中的下标
  44. * @param {Object} val
  45. */
  46. Class.prototype.indexOf = function (arr, val) {
  47. for (var i = 0; i < arr.length; i++) {
  48. if (arr[i] == val) return i;
  49. }
  50. return -1;
  51. };
  52. /**
  53. * 初始化父下拉列表
  54. */
  55. Class.prototype.init = function () {
  56. var _this = this;
  57. //select 容器
  58. _this.box = $('<div class="layui-input-inline"></div>');
  59. //初始化值
  60. if(JSON.stringify(_this.valObj) != '{}'){
  61. _this.val();
  62. }
  63. //渲染首下拉框
  64. _this.element(_this.formParm[0]);
  65. };
  66. Class.prototype.element = function (name, code, callback) {
  67. var _this = this;
  68. //验证子接口配置
  69. if (!_this.url[name]) {
  70. // layer.msg("没有配置下级接口",{icon:2,time:600});
  71. return _this;
  72. }
  73. //获取设置默认子集请求参数(子集合父id)
  74. _this.data[_this.hostParm['idName']] = code || null;
  75. //设置默认请求页码
  76. _this.data['page'] = _this.data['page'] || 1;
  77. $.ajax({
  78. url: _this.url[name],
  79. data: _this.data,
  80. success: function (res) {
  81. //指定select唯一ID
  82. let select_id = "select_"+_this.___id;
  83. //获取当前级联字段下标
  84. let subscript = _this.indexOf(_this.formParm, name);
  85. // _this.thanName(name);
  86. //保存当前select对象
  87. _this.boxs[subscript] = $(_this.selectHtml(select_id, name, res));
  88. //往select容器添加包装好的select对象
  89. $(_this.elem).append(_this.boxs[subscript]);
  90. //绑定select点击事件
  91. _this.event(name,select_id);
  92. //执行赋值回调函数
  93. !!callback && callback(name, select_id);
  94. typeof _this.valObj[name] != 'undefined' && ($("#" + select_id+name).val(_this.valObj[name]));
  95. form.render();
  96. }
  97. });
  98. };
  99. /**
  100. * 包装Html
  101. */
  102. Class.prototype.selectHtml = function (select_id, name, res) {
  103. var _this = this;
  104. var html = '<div class="layui-input-inline" style="width:'+(this.width[name] || "auto")+';"><select name="' + name + '" lay-verify="' + this.verify[name] +
  105. '" lay-filter="' + select_id+name + '" id="' +
  106. select_id+name + '"><option value="">'+(this.placeholder[name] || '请选择')+'</option>';
  107. for (let xyz = 0; xyz < res.data.length; xyz++) {
  108. html += '<option value="' + res.data[xyz][_this.listParamName['valueName']] + '">' + res.data[xyz][_this.listParamName[
  109. 'name']] + '</option>';
  110. }
  111. return (html + '</select></div>');
  112. };
  113. Class.prototype.event = function (name,select_id) {
  114. var _this = this;
  115. var x = _this.indexOf(_this.formParm, name);
  116. form.on("select(" + select_id+name + ")", function (obj) {
  117. _this.removeBox(x);
  118. if(!obj.value){
  119. return false;
  120. };
  121. _this.element(_this.formParm[x - 0 + 1], obj.value);
  122. _this.click(obj);
  123. return false;
  124. });
  125. };
  126. Class.prototype.click = function (obj) {
  127. };
  128. Class.prototype.removeBox = function (i) {
  129. var _this = this;
  130. for (var x = i + 1; x < _this.boxs.length; x++) {
  131. _this.boxs[x].remove();
  132. }
  133. };
  134. Class.prototype.thanName = function (name) {
  135. for (let i = 0; i < this.boxs.length; i++) {
  136. if (this.boxs[i][0].firstChild && this.boxs[i][0].firstChild.name == name) {
  137. this.boxs[i].remove();
  138. }
  139. }
  140. };
  141. /**
  142. * 初始值
  143. */
  144. Class.prototype.val = function (obj) {
  145. var _this = this;
  146. $.extend(_this.valObj, obj);
  147. (function temp(i) {
  148. if (_this.valObj[_this.formParm[i + 1]]) {
  149. _this.element(_this.formParm[i - 0 + 1], _this.valObj[_this.formParm[i]], function (name, select_id) {
  150. if (i == -1) {
  151. _this.removeBox(i);
  152. }
  153. temp(++i);
  154. });
  155. }
  156. })(-1);
  157. return _this;
  158. };
  159. var cascade = {};
  160. cascade.render = function (e) {
  161. e.___id = this.id = (this.id || 0) - 0 + 1;
  162. var i = new Class(e = e || {});
  163. t = $(e.elem);
  164. return t[0] ? i : layui.hint().error("layui.cascade 没有找到" + e.elem + "元素");
  165. };
  166. exports('cascade', cascade);
  167. });