QFaces1.1新增了一个新的组件,修复了上一版中的Validator的一个错误,同时附带了Demo项目.
新增的组件我叫它超级联动: Linkage
为什么叫超级联动?
1.可以无限联动.
2.可以不用刷新页面.
3.几乎没有性能影响.
4.你不用改变现有的JSF组件.
5.而且使用还非常简单 : )
<q:linkage for="country,province,city,area,street" listener="#{LinkageBean.listener}" />
for: 指定到页面其它selectOne组件的id,无个数限制
listener: 后台方法绑定,返回相应的选项列表就可以
实际应用中我们经常会碰到需要级联选择的功能,比如:国家,省级,市级等的级联选择,这些实现起来并不容易,
并且要实现较好的兼容性也不是一件轻松的事情,如果要使用者再添加一大堆的javascript也是很麻烦的事情。
所以我尽量使用非侵入式的方式,将它实现得比较轻松自由,并且让使用者以最简单的方式使用,这是我的目标。
在不改变你的代码及逻辑的情况下,使用这个组件就可以将你页面中的所有selectOne组件变成拥有级联关系的!!
如果你感觉很神奇,那就去学一学JSF这个框架吧,实际上自定义组件才是JSF的精华, 这绝对是你发挥无限想象力的地方!
关于下载,安装,及使用,后面附有链接。
先看一下这个组件的效果图吧:
图1 图2
以下是html页面源码,只要在第一级别提供选项就可以:
1 <h:form>
2 <!-- 国家,省份,城市,城区,街道 -->
3 <h:selectOneMenu id="country" value="#{LinkageBean.country}">
4 <f:selectItem itemValue="" itemLabel="" />
5 <f:selectItem itemValue="China" itemLabel="中国" />
6 </h:selectOneMenu>
7 <h:selectOneMenu id="province" value="#{LinkageBean.province}" />
8 <h:selectOneMenu id="city" value="#{LinkageBean.city}"/>
9 <h:selectOneMenu id="area" value="#{LinkageBean.area}"/>
10 <h:selectOneMenu id="street" value="#{LinkageBean.street}"/>
11
12 <q:linkage for="country,province,city,area,street" listener="#{LinkageBean.listener}" />
13
14 <h:commandButton value="Submit" action="#{LinkageBean.action}" />
15 <h:outputText value="你的选择:#{LinkageBean.country}-#{LinkageBean.province}-#{LinkageBean.city}-#{LinkageBean.area}-#{LinkageBean.street}" />
16</h:form>
这样可以让你无限的添加 h:selectOne..., 这样你可以实现自己的无限级联。
下面是后台bean所绑定的一个侦听方法,该方法只是返回相应的选项列表而已
1 public Items listener(Level level) {
2 if (level.getLevel() == 0) { // 如果触发的是第一级(国别)的选择,返回省级列表
3 Items items = new Items();
4 if ("China".equals(level.getValue())) {
5 Item bj = new Item("bj", "北京");
6 Item hn = new Item("hn", "河南");
7 Item gd = new Item("gd", "广东");
8 items.add(bj);
9 items.add(hn);
10 items.add(gd);
11 gd.setSelected(true); // 设置默认值
12 }
13 return items;
14 } else if (level.getLevel() == 1) { // 如果触发的是第二级(省级)的选择
15 Items items = new Items();
16 if ("gd".equals(level.getValue())) {
17 items.add(new Item("gz", "广州"));
18 items.add(new Item("sz", "深圳"));
19 items.add(new Item("st", "汕头"));
20 }
21 if ("hn".equals(level.getValue())) {
22 items.add(new Item("zz", "郑州"));
23 items.add(new Item("ly", "洛阳"));
24 items.add(new Item("kf", "开封"));
25 }
26 return items;
27 } else if (level.getLevel() == 2) { // 如果触发的是第三级(市级)的选择
28 Items items = new Items();
29 if ("gz".equals(level.getValue())) {
30 items.add(new Item("byq", "白云区"));
31 items.add(new Item("yxq", "越秀区"));
32 items.add(new Item("thq", "天河区"));
33 }
34 return items;
35 } else if (level.getLevel() == 3) { // 如果触发的是第四级(区级)的选择
36 Items items = new Items();
37 if ("byq".equals(level.getValue())) {
38 items.add(new Item("sc", "沙涌"));
39 items.add(new Item("tx", "棠下"));
40 items.add(new Item("bz", "北站"));
41 items.add(new Item("syl", "三元里"));
42 }
43 return items;
44 }
45 // 第五个级别不用触发
46 return null;
47 }
这个方法看起来有点长,但是很简单,如果要实现更多的级联,就继续写 else if 或 switch吧. 当然这只是模拟,
实际应用中你可以从数据库中取出数据,进行徇环。
以下是QFaces的下载地址,如果你在使用过程中遇到问题,可以与我联系!欢迎交流学习。
QFaces 下载页面 -- 基于JSF的Ajax增强框架。
-----------------以下是 linkage 这个组件的属性说明,只有两个属性而已:
属性
|
类型
|
说明
|
必需
|
for
|
String
|
指定到需要提供需入帮助的组件ID, 如:
for=”id1,id2,id3” 将需要变成多级联动的页面组件的id用”,”号隔开.这时,id1,id2,id3将被变成三级联动.
级别依次为:0, 1, 2 (你可以在后台绑定的方法中获得用户的触发级别)
|
是
|
listener
|
Method
|
组件所绑定的后台侦听方法,方法签名如下:
Items
listener(Level)
你可以从参数Level中获得用户当前触发的下拉框的级别,当前值及label值
|
是
|
好吧,再来一张,看看是否有淘宝购物时的感觉!
- huliqing@huliqing.name
- http://www.huliqing.name