在以前的项目中所认知的字典联动传值都是点击AJAX二次请求,或者是DWR的,今天为了减少一次请求,特地来了来了个一次传值。于是开始了折腾之路。
字典A是select项目 类型,字典B是项目类型子项,A改变,B也跟着相应的改变,前面值变化影响后面,这是项目中应用非常非常多的场景。
我首先写了后台sql,DB2数据库,
select a.id,a.TITLE,a.name,ROW_NUMBER() OVER(PARTITION BY a.id ORDER BY a.TINDEX) as index from (select ss.id,ss.TITLE,sl.name, sl.TINDEX from table1 ss
left join
table2 sl on
ss.id=sl.PARAMID
where
sl.ISDEL='0' and (ss.id='11' or ss.id='12' or ss.id='13')
and sl.STATUS='1' )a ;
数据如下:
ID
TITLE NAME INDEX
11
项目培训
全行
1
11
项目培训
本单位
2
11
项目培训
外
单位
3
11
项目培训
行外机构 4
12
实习培训
新入职
1
12
实习培训
跨组別
2
12
实习培训
跨单位
3
很普通的sql,此处用了开窗函数,呵呵。
数据的展示看起来还不错,然后我就直接传了list到页面了,原生的java list,未做任何处理放到request域中,这也是折腾的开始:
到了页面之后,我开始各种绞净脑汁的想办法处理这一坨值 ,从request中取出来放到js里,放到页面中,各种符号不对,格式不对,靠,差点让人放弃了。痛苦,最后代码形成如下
到了页面之后,我开始各种绞净脑汁的想办法处理这一坨值 ,从request中取出来放到js里,放到页面中,各种符号不对,格式不对,靠,差点让人放弃了。痛苦,最后代码形成如下
//初始化select的值
<span >項目類型</span>
<select οnchange="projectchange(this);"id="projecttypes" >
<%
int i=0;
for(Map<String, Object> item :list){ //list的增强for循环,开始是用普通for的,发现不行
if(i>0){
String a=list.get(i).get("ID").toString();
String b=list.get(i-1).get("ID").toString();
if(!a.equals(b)){ //在这里去重
%>
<option value="<%=list.get(i).get("ID") %>"><%=list.get(i).get("TITLE") %></option>
<%
}
}else{
%>
<option value="<%=list.get(0).get("ID") %>"><%=list.get(0).get("TITLE") %></option>
<%
}
i++;
}%>
</select>
下面是折腾的重点来了! onchange触发事件
function projectchange(t){
$("#projecttypesunit").empty();
<%int v=0;
List<Map<String,Object>> list =(List<Map<String,Object>>)request.getAttribute("listtypes");
for(Map<String, Object> item :list){
String a=list.get(v).get("ID").toString(); //拿到标识的ID
%>
var b="<%=list.get(v).get("NAME") %>"; //用变量b保存NAME,此处b折腾了好久
![](http://ctc.qzs.qq.com/qzone/em/e135.gif)
if($(t).find(":selected").val()=="11"){ //項目培训
<%if(a.equals("11")){%>
$("#projecttypesunit").append("<option value="+<%=list.get(v).get("INDEX")%>+">"+b+"</option>");
<%}%>
}else if(...) {
//下面还有12,13,代码一样的
}
}
<%v++;} %>
}
整篇都是java代码跟js代码杂交在一起,看得人痛苦!我改了半天,在append后面的符号上报错都搞了好久,后来实在不行用变量b代替了 ,此处list也给了页面中的增强for使用了。结束了测试完美实现。 看来还是应该转成json传过来的,代码就会美观一点。
效果是实现了但是感觉非常不可取,如果不是因为这个项目限制,我应该可以使用其它更好的方法。