【问题标题】:h:SelectOneMenu onchange event not workingh:SelectOneMenu onchange 事件不起作用
【发布时间】:2012-09-01 16:32:12
【问题描述】:

我有两个 oneSelectMenu 根据登录详细信息加载了默认值,然后第二个 selectonemenu 应该根据第一个 selectonemenu 的 onchangeEvent 菜单加载值。我尝试在 onchange 事件之前清除默认值,但该值仍然存在并且不适用于 onchange事件。

<h:selectOneMenu id="blS" value="#{BoardAction.serviceAreaId}" >
<f:ajax event="valueChange" render="blSearchFacilityInput" listener="#{BoardAction.svaValueChangeEvent}"/> 
 <f:selectItems value="#{BoardAction.serviceAreaList}" var="c"  itemLabel="#{c.svaCode}" itemValue="#{c.id}"/> </h:selectOneMenu>

 <h:selectOneMenu id="blSearchFacilityInput" value="#{BoardAction.facilityId}">                                                         <f:ajax event="valueChange" render="blSearchSectorInput" listener="#{BoardAction.facValueChangeEvent}"/> 
<f:selectItems value="#{BoardAction.svaFaciltyList}" var="c" itemLabel="#{c.facCode}" itemValue="#{c.id}"/></h:selectOneMenu>

动作豆:

private List<FacilityEBean> svaFaciltyList=null;

public List<FacilityEBean> getSvaFaciltyList() {
svaFaciltyList = facilityBusServ.getFacilityListBySVAId(session.getLoginUser());
return svaFaciltyList;
    }

public List<FacilityEBean> svaValueChangeEvent(){
        if(svaFaciltyList!=null){
            svaFaciltyList.clear();
            svaFaciltyList=null;
        }

  svaFaciltyList = facilityBusServ.getFacilityList(Integer.parseInt(serviceAreaId));
  return svaFaciltyList;

    }

【问题讨论】:

    标签: jsf-2 onchange selectonemenu


    【解决方案1】:

    您的代码逻辑流程错误。您似乎期望输入组件以某种方式直接绑定到属性,并且 ajax 操作侦听器方法可以返回(更改的)属性值。因此这实际上是不正确的。

    例如,EL 表达式#{BoardAction.serviceAreaList} 实际上调用了属性的getter 方法。在您的特定情况下,getter 方法每次都会用数据库的结果填充列表。因此,无论您在 ajax 侦听器方法中设置什么,每次都会被 getter 方法中的业务逻辑覆盖。

    那些 getter 方法应该包含业务逻辑。你需要重写你的代码如下:

    private List<FacilityEBean> svaFaciltyList;
    
    @PostConstruct
    public void init() {
        svaFaciltyList = facilityBusServ.getFacilityListBySVAId(session.getLoginUser());
    }
    
    public void svaValueChangeEvent() {
        svaFaciltyList = facilityBusServ.getFacilityList(Integer.parseInt(serviceAreaId));
    }
    
    public List<FacilityEBean> getSvaFaciltyList() {
        return svaFaciltyList;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      相关资源
      最近更新 更多