Cascadequery.js 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. /**
  2. * 说明
  3. * [formtype="window"]主要是处理子表弹出框模式,
  4. * table.listTable 处理子表的块模式和表内模式
  5. */
  6. if (typeof QueryUI == 'undefined') {
  7. QueryUI = {};
  8. }
  9. /**
  10. * queryedCacheData保存当前页面的已经查询出来的数据
  11. * 数据格式:
  12. * queryedCacheData{
  13. *
  14. * }
  15. */
  16. QueryUI.queryedCacheData={};
  17. /**
  18. * 加上targetObj,针对该对象下的级联进行初始化,
  19. * 在CustomForm.js中初始化子表级联时使用
  20. */
  21. QueryUI.init = function(targetObj){
  22. var querys;
  23. var filters = "select[selectquery][selectqueryed!='selectqueryed']";
  24. if(targetObj){//绑定指定对象下的级联
  25. querys = $(targetObj).find(filters);
  26. }else {
  27. querys = $(filters);
  28. }
  29. querys.each(function(){
  30. var me = $(this),
  31. selectquery = me.attr("selectquery");
  32. if (!selectquery)
  33. return true;
  34. selectquery = selectquery.replaceAll("'", "\"");
  35. var queryJson = JSON2.parse(selectquery);
  36. var query = queryJson.query;
  37. for (var i = 0; i < query.length; i++) {
  38. var field;
  39. if(query[i].trigger=='-1')
  40. continue;
  41. // isMain是true 就是绑定主表的字段
  42. if (query[i].isMain=="true") {
  43. field = $(".formTable [name$=':" + query[i].trigger + "']");
  44. } else {
  45. field = me.closest('tr').find("[name='" + query[i].trigger + "']");
  46. if(field.length==0){
  47. field = me.parents('table,[formtype="window"]').find("[name='" + query[i].trigger + "']");
  48. }
  49. field.unbind("change");
  50. }
  51. if (field != ""){
  52. QueryUI.change(field, me, queryJson);
  53. }
  54. }
  55. QueryUI.getvalue(me, queryJson, true);
  56. });
  57. };
  58. QueryUI.change = function(field, SelectObj, queryJson) {
  59. field.bind("change", function() {
  60. QueryUI.getvalue(SelectObj, queryJson);
  61. });
  62. };
  63. QueryUI.replaceValue = function(objValue) {
  64. return objValue.replaceAll(",", "#,");
  65. }
  66. var cachedJson={};
  67. QueryUI.getCachedHtml = function(queryJson) {
  68. return cachedJson[queryJson.name+'_'+queryJson.binding.key+'_'+queryJson.binding.value];
  69. }
  70. QueryUI.setCachedHtml = function(queryJson, html) {
  71. cachedJson[queryJson.name+'_'+queryJson.binding.key+'_'+queryJson.binding.value] = html;
  72. }
  73. /**
  74. * isInit,表示是否为表单初始化设置级联
  75. * 表单初始化时,如果B级联需要的查询条件为A级联的值,则不初始化B级联下拉框,在A级联的值改变时,才会触发B级联的初始化
  76. */
  77. QueryUI.getvalue = function(SelectObj, queryJson, isInit) {
  78. var query = queryJson.query;
  79. if(query.length==0){// 对没有查询条件的级联进行缓存
  80. var cachedHtml = QueryUI.getCachedHtml(queryJson);
  81. if(typeof(cachedHtml)=='undefined'){// 如果没有缓存
  82. QueryUI.setCachedHtml(queryJson, 1);// 标识正在建立缓存
  83. }else {// 如果有缓存
  84. // cachedHtml==1时,表示正在初始化所有级联,但缓存未完全建立,在建立缓存时,会填充下拉框数据
  85. if(cachedHtml != 1) {// cachedHtml!=1时,可直接填充缓存数据
  86. SelectObj.html(cachedHtml);
  87. //添加一个属性,标识已经处理过,
  88. SelectObj.attr("selectqueryed","selectqueryed");
  89. }
  90. return;
  91. }
  92. }
  93. var fieldValue, subfield, checkfield,field;
  94. var querydataStr = "{";
  95. for (var i = 0; i < query.length; i++) {
  96. var triggerField = query[i].trigger;
  97. if (query[i].isMain=="true") {
  98. //输入框,下拉框,数据字典
  99. subfield = $(".formTable [name$=':" + triggerField + "']");
  100. // 选择器
  101. field = $(".formTable [name$=':" + triggerField + "ID']");
  102. // 单选、复选框
  103. checkfield = $(":checked[name$=':" + triggerField + "']");
  104. } else {
  105. subfield = SelectObj.closest('tr').find("[name='" + triggerField + "']");
  106. if(subfield && subfield.length>0){
  107. field = SelectObj.closest('tr').find("input[name='" + triggerField + "ID']");
  108. checkfield = SelectObj.closest('tr').find(":checked[name='" + triggerField + "']");
  109. }else {
  110. subfield = SelectObj.parents('table,[formtype="window"]').find("[name='" + triggerField + "']");
  111. field = SelectObj.parents('table,[formtype="window"]').find("input[name='" + triggerField + "ID']");
  112. checkfield = SelectObj.parents('table,[formtype="window"]').find(":checked[name='" + triggerField + "']");
  113. }
  114. }
  115. if(isInit && subfield.is('select')) {
  116. return false;
  117. }
  118. //级联参数值为空时,将子级联清空
  119. if((typeof subfield.val() == "undefined" || subfield.val() =="") && query[i].initValue==""){
  120. SelectObj.html('');
  121. SelectObj.trigger("change").trigger('blur');
  122. return false;
  123. }
  124. switch (query[i].controlType) {
  125. //没有绑定任何表字段controlType=-1而有预设值时
  126. case '-1':break;
  127. // 输入框,下拉框,数据字典是一类直接获取值
  128. case '1' :
  129. case '2' :
  130. case '3' :
  131. case '11' :
  132. case '15' :
  133. fieldValue = subfield.val();
  134. break;
  135. // 选择器
  136. case '4' :
  137. case '5' :
  138. case '6' :
  139. case '7' :
  140. case '8' :
  141. case '17' :
  142. case '18' :
  143. case '19' :
  144. fieldValue =field.val();
  145. fieldValue = QueryUI.replaceValue(fieldValue);
  146. break;
  147. // 单选、复选框
  148. case '13' :
  149. case '14' :
  150. var tempvalue;
  151. checkfield.each(function() {
  152. var obj = $(this);
  153. if (typeof(tempvalue) != "undefined"
  154. && tempvalue != "") {
  155. tempvalue += "#," + obj.val();
  156. } else {
  157. tempvalue = obj.val();
  158. }
  159. });
  160. fieldValue = tempvalue;
  161. tempvalue = "";
  162. break;
  163. }
  164. //如果对应的绑定字段有值则使用该值,没有值则判断设计时有没有输入预设值,有预设值则使用,没有则不做输入条件
  165. var condition = query[i].condition;
  166. var initValue = query[i].initValue;
  167. if (fieldValue && fieldValue!==0) {
  168. querydataStr += condition + ":\"" + fieldValue + "\",";
  169. }else if(initValue!='' && initValue!==0){
  170. querydataStr += condition + ":\"" + initValue + "\",";
  171. }
  172. }
  173. if (querydataStr.length > 1){
  174. querydataStr = querydataStr.substring(0, querydataStr.length - 1);
  175. }
  176. querydataStr += "}";
  177. SelectObj.empty();
  178. queryCond = {
  179. alias : queryJson.name,
  180. querydata : querydataStr,
  181. page : 0,
  182. pagesize : 0
  183. };
  184. DoQuery(queryCond, function(data) {
  185. var list = data.list;
  186. if (data.errors || list.length==0) return;
  187. QueryUI.handData(list,queryJson,SelectObj);
  188. },false);
  189. };
  190. /**
  191. * 获取数据以后经过处理,显示多下拉列表中
  192. * 修改时间:2015-05-18 14:05
  193. */
  194. QueryUI.handData=function(data,queryJson,currSelectObj){
  195. var selectObj=$(currSelectObj);
  196. var queryValue = queryJson.binding.value.toLowerCase();
  197. var queryKey = queryJson.binding.key.toLowerCase();
  198. selectObj.html("<option value=''>请选择……</option>");
  199. for (var i = 0; i < data.length; i++) {
  200. var dataobj = data[i];
  201. var datavalue = dataobj[queryValue];
  202. var datakey = dataobj[queryKey];
  203. var opt = $("<option>").val(datakey).text(datavalue);
  204. selectObj.append(opt);
  205. }
  206. selectObj.attr("selectqueryed","selectqueryed");
  207. if(queryJson.query.length == 0){
  208. var html = selectObj.html();
  209. // 设置缓存html
  210. QueryUI.setCachedHtml(queryJson, html);
  211. //填充所有相同查询的级联
  212. $('select[selectqueryed!="selectqueryed"][selectquery="{\'name\':\''
  213. +queryJson.name+'\',\'binding\':{\'key\':\''
  214. +queryJson.binding.key+'\',\'value\':\''
  215. +queryJson.binding.value+'\'},\'query\':[]}"]')
  216. .html(html)
  217. .each(function(){
  218. QueryUI.triggerChange(this);
  219. })
  220. .attr("selectqueryed","selectqueryed");
  221. }
  222. QueryUI.triggerChange(currSelectObj);
  223. };
  224. /**
  225. * 给下拉框设置值,如果值发生改变,则触发change事件
  226. */
  227. QueryUI.triggerChange=function(currSelectObj){
  228. var selectObj=$(currSelectObj);
  229. var tempValue = selectObj.attr("val");
  230. selectObj.val(tempValue);
  231. if(tempValue || tempValue === 0) selectObj.trigger("change").trigger('blur');
  232. };
  233. /**
  234. * 获取缓存数据
  235. */
  236. QueryUI.getCascaData = function(alias,querydata){
  237. if(!QueryUI.queryedCacheData)return;
  238. var tempAlias=QueryUI.queryedCacheData[alias];
  239. if(!tempAlias)return ;
  240. var tempData=tempAlias[querydata];
  241. return tempData;
  242. };
  243. /**
  244. * 设置缓存数据
  245. */
  246. QueryUI.setCascaData = function(alias,querydata,data){
  247. var aliasObj = QueryUI.queryedCacheData[alias] || {};
  248. aliasObj[querydata] = data;
  249. QueryUI.queryedCacheData[alias] = aliasObj;
  250. };