最近做J2EE项目,遇到这么一个问题,设备(device)在房间(room)里,房间在楼层(building)里,在添加设备(device)的时候,需要room和building的一个二级联动,通过查资料可以用ajax,s标签的doubleselect,我选择了后者,添加的时候没有遇到问题,顺利解决了问题,但是在我要修改device的信息的时候,我需要修改上面那个二级联动,doubleselect自带的headervalue是可以用的,新增一个option,但是第二个select的初始值是不好用的,就是说doubleheadervalue是没办法正常达到我的需求的,百度,谷歌,csdn等等查了一些资料,都是再问问题却没有找到一个合理的解决方案。
开始的时候我想到了3种解决方案:
1.修改s标签的源码,DoubleListUIBean,DoubleSelect,AbstractDoubleListTag,DoubleSelectTag,还有几个vm文件,通过查看html源码和对应着java源码,.vm源码,想找到修改的方法,才疏学浅,没搞定……后面如果捣鼓清楚了,再回回来补充~
2.用JS页面上直接控制selected,尝试之后发现,第一个管用,第二个还是不管用,愁死了,可能需要继续优化~
3.通过对原理的理解,doubleselect的默认select都是第0位的option,原来用法是:
//获取第一个select的list
buildingList = buildingService.findAll();
//组装map,组装第二个select
map = new LinkedHashMap<Integer,List<Room>>();
or(int i=0;i<buildingList.size();i++){
Building building = buildingList.get(i);
roomList = building.getRooms();
map.put(building.getId(), roomList);
}
当然所需要的get,set这里就不多说了,到页面上就是按照顺序,selected放在了第0位,这样的话,我要实现它的初始化就把device原来的room和building放在第0位就可以了,这里还应注意,buildinglist里device.room.device放在0位之后,map里的添加也要放在0位,然后是roomlist里的device.room放在0位,代码实现如下:
device = deviceService.findById(entityId);
buildingList = buildingService.findAll();
//重组第一个select的list
for(int i=0;i<buildingList.size();i++){
if(device.getRoom().getBuilding() == buildingList.get(i)){
buildingList.remove(i);
buildingList.add(0, device.getRoom().getBuilding());
break;
}
}
//LinkedHashMap 插入顺序不变,不会按照key排序
map = new LinkedHashMap<Integer,List<Room>>();
//重组第二个select的list
List<Room> roomList = device.getRoom().getBuilding().getRooms();
for(int i=0;i<roomList.size();i++){
if(device.getRoom() == roomList.get(i)){
roomList.remove(device.getRoom());
roomList.add(0,device.getRoom());
break;
}
}
map.put(device.getRoom().getBuilding().getId(), roomList);
for(int i=0;i<buildingList.size();i++){
if(device.getRoom().getBuilding().getId() == buildingList.get(i).getId()){
}else{
Building building = buildingList.get(i);
roomList = building.getRooms();
map.put(building.getId(), roomList);
}
}
ActionContext.getContext().put("device", device);
我要修改的信息;
device详细信息,building和room已经初始化