[Ajax4JSF] jsf页面<h:selectOneMenu>标签中使用<a4j:support>实现级联菜单问题。

m_isunshine 2008-07-19
下面是页面里的部分代码
<h:outputLabel value="上级单位:"></h:outputLabel>
<h:selectOneMenu value="#{infoManageBean.deptValue}">
    <a4j:support event="onchange" actionListener="#{infoManageBean.refreshSubDeptList}"  reRder="subDeptSel">
    </a4j:support>
<f:selectItems value="#{infoManageBean.deptList}"/>
</h:selectOneMenu>

<h:outputLabel value="所属单位:"></h:outputLabel>
<h:selectOneMenu value="#{infoManageBean.subDeptValue}">
<f:selectItem id="subDeptSel" value="#{infoManageBean.subDeptList}"/>
</h:selectOneMenu>

这里是backing bean里面的响应事件的代码
public void refreshSubDeptList(ActionEvent e) throws ApplicationException {
    subDeptList = new HashMap();
    StringBuffer filterString = new StringBuffer(" 1=1 ");
    filterString[color=darkred][/color].append(" AND PARENT_ID=").append(this.deptValue).append(" ");
    BizDataObjects bizDataObjects = bizDataObjectManager.getBizDataObjects(TABLE_NAME_DEPART, filterString.toString(), "ID");
    List list = bizDataObjects.getBizDataObjectList();
    for (int i = 0; i < list.size(); i++) {
    BizDataObject bizObject = (BizDataObject) list.get(i);
    subDeptList.put(bizObject.get("DEPT_NAME").toString(), bizObject.get("ID").toString());//Map实现
    }
}


代码目的:选择某“上级单位”后,“所属单位”显示“上级单位”的所有下级单位,也就是这里的所谓“所属单位”。
问题原因:进入该页面后,点选某一“上级单位”,debug代码发现第一次点选是可以走到refreshSubDeptList(),subDeptList也得到了更新,但是页面里“所属单位”选择项却没有得到更新。第二次点选“另一上级单位”后,debug发现不走refreshSubDeptList()方法,一直调用getSubDeptList(),因为使用了 <saveState>标签,一直保持第一次点选“上级单位”后的结果。
我的问题:是不是我的标签用的不对?还是event="onchange"这里响应事件不对?
另说明:subDeptList的获取肯定没有问题的。
不知道把问题说清楚了没有,刚开始使用jsf做项目,比较菜,先表示一下感谢!
m_isunshine 2008-07-20
 
m_isunshine 2008-07-20
谁能给我指点一二?
guooo 2008-07-21
关注
wangwenpinghello 2008-07-21
所属单位没有更新,可能是你没有get,set方法,或是再哪个方法里给初始化了
为什么大家都喜欢用actionListener呢

<h:selectOneMenu value="#{dareportmanagebean.selectbigsortid}">
<f:selectItems value="#{dareportmanagebean.bigsorts}" />
<a4j:support event="onchange" action="#{dareportmanagebean.selectbigsortInput}" reRender="form1:kwlbs"></a4j:support>
</h:selectOneMenu>


<a4j:outputPanel id="kwlbs">
<h:selectOneMenu value="#{dareportmanagebean.selectsmallsortid}" id="kwlbsb">
<f:selectItems value="#{dareportmanagebean.smallsortss}" />
<a4j:support action="#{dareportmanagebean.changsmallportsb}" event="onchange" reRender="form1:period"></a4j:support>
</h:selectOneMenu>
</a4j:outputPanel>

onchange事件没有错,按照我这样写,不会错
注意:1,a4j:support要用action, reRender要绘制的组建必须要用a4j:outputPanel,因为他在源代码中是<span>,一般我都这么用,可能用组建id也好使。
2,SelectItem构造里的参数应该是对象,其他的都照常对应后台的属性和方法就可以了

public void selectbigsortInput(){
try {
Page p = theIDatareportManageService.getManDictionaryVO(this.selectbigsortid);
if(p!=null){
List l = (List) p.getData();
if(l!=null&& l.size()>0){
smallsortss = new SelectItem[l.size()+1];
smallsortss[0] = new SelectItem("0","--请选择--");
for(int i=0; i<l.size();i++){ ManDictionaryVO m = (ManDictionaryVO) l.get(i);
smallsortss[i+1] = new SelectItem(String.valueOf(m.getIordnum().intValue()),m.getSentname());
}
}else{
smallsortss = new SelectItem[1];
smallsortss[0] = new SelectItem("0","--没有刊物类别--");
}
} catch (FireDAOException e) {
e.printStackTrace();
}

}

public SelectItem[] getSmallsortss() {
return smallsortss;
}

public void setSmallsortss(SelectItem[] smallsortss) {
this.smallsortss = smallsortss;
}

其他属性方法和上面类似,省略了
yourenyouyu2008 2008-07-23
为什么不给actionListener绑定的方法加个参数呢,比如infoManageBean.refreshSubDeptList(上级),这样多简单呀。
m_isunshine 2008-07-24
to wangwenpinghello
感谢你的回答,今天晚上才看到,呵呵
按照你的方法我去试试,有问题再请教你。
maxwell 2008-09-04
<h:outputLabel value="上级单位:"></h:outputLabel> 
<h:selectOneMenu value="#{infoManageBean.deptValue}"> 
    <a4j:support event="onchange" actionListener="#{infoManageBean.refreshSubDeptList}"  reRder="subDeptSel"> 
    </a4j:support> 
<f:selectItems value="#{infoManageBean.deptList}"/> 
</h:selectOneMenu> 
 
<h:outputLabel value="所属单位:"></h:outputLabel> 
<h:selectOneMenu value="#{infoManageBean.subDeptValue}"> 
<f:selectItem id="subDeptSel" value="#{infoManageBean.subDeptList}"/> 
</h:selectOneMenu>
maxwell 2008-09-04
应该是reRender=""
下面的id 不要放在 selectItem里   放在 selectOneMenu 那里

maxwell 2008-09-04
<h:outputLabel value="上级单位:"></h:outputLabel>
<h:selectOneMenu value="#{infoManageBean.deptValue}">
<a4j:support event="onchange" actionListener="#{infoManageBean.refreshSubDeptList}" reRender ="subDeptSel">
</a4j:support>
<f:selectItems value="#{infoManageBean.deptList}"/>
</h:selectOneMenu>

<h:outputLabel value="所属单位:"></h:outputLabel>
<h:selectOneMenu value="#{infoManageBean.subDeptValue}" id="subDeptSel">
<f:selectItem  value="#{infoManageBean.subDeptList}"/>
</h:selectOneMenu>
Global site tag (gtag.js) - Google Analytics