我正在使用MyFaces 2.0.12和RichFaces 3.3.3。当用户更改Session scope
的选择时,我需要在BackBean(h:selectOneMenu
)中调用两个不同的函数。以前我做过如下:
<h:selectOneMenu
value="#{customer.recordsDisplayed}"
valueChangeListener="#{customer.onRecordsPerPageChange}"
onchange="submit()"
<f:selectItems value="#{customer.rppValues}" />
</h:selectOneMenu>
并在backbean中:
public void onRecordsPerPageChange(ValueChangeEvent vce){
if(this.searchFlagAdvance)
searchMethodA();
else
searchMethodB();
}
我理解上述内容是错误的,因为您不打算在ValueChangeEvent阶段调用逻辑或更改backbean值。
所以我的问题是什么是正确的方法?因为上面的代码我进入了backbean值为null并且整个事情变得平坦的场景。
我将代码更改为以下内容并且完美无缺。我只是想知道以下是不是很好的做法。
public void onRecordsPerPageChange(ActionEvent event) {
String value =(String) ((EditableValueHolder) event.getComponent().getParent()).getValue();
this.value = value;
if(searchFlagA)
searchMethodA();
else
searchMethodB();
}
并将JSP代码更改为:
<h:selectOneMenu
id="selectRecordDisplay"
value="#{customer.recordsDisplayed}"
<f:selectItems value="#{customer.rppValues}" />
<a4j:support event="onchange" actionListener="#{customer.onRecordsPerPageChange}" reRender="pangelgrid"></a4j:support>
</h:selectOneMenu>
答案 0 :(得分:2)
由于您使用的是JSF 2.0,因此可以使用ajax:
<h:selectOneMenu value="#{customer.recordsDisplayed}">
<f:selectItems value="#{customer.rppValues}" />
<f:ajax action="#{customer.onRecordsPerPageChange}"
execute="idsToBeProcessed"
render="idsToBeRendered"/>
</h:selectOneMenu>
使用follogin操作方法:
public void onRecordsPerPageChange(AjaxBehaviorEvent event) {
...
}
在execute
属性列表中,需要在服务器端处理的所有组件的id(空格分隔),尤其是侦听器方法所依赖的组件。当{a}参数返回时,render
属性将获取需要重新呈现的所有组件ID。如果将@form
放在一个或两个属性中,则将处理/呈现整个表单。