我在 WebSphere Application Server 上使用 PrimeFaces 3.3.1 和 Apache MyFaces 2。我的 BackingBean 是 SessionScoped。我有一个带有 selectOneButton 的表单应该更新整个表单。
<h:form id="options">
<p:panelGrid>
<p:column rowspan="2" style="width:115px;">
<p:selectOneButton value="#{graph.diagramdata}" id="diagramdata">
<f:selectItem itemLabel="WAS-Diagramm" itemValue="1" />
<f:selectItem itemLabel="PSC-Diagramm" itemValue="2" />
<p:ajax listener="#{graph.changeView }" update=":options"/>
</p:selectOneButton>
<h:outputText>#{graph.diagramdata}</h:outputText>
</p:column>
<p:column rendered="#{graph.diagramdata eq '1' }">
...
</p:column>
</p:panelGrid>
</h:form>
编辑:支持豆的一部分
@ManagedBean(name = "graph")
@SessionScoped
public class MyGraphBean implements Serializable {
private int diagramdata;
public void changeView(AjaxBehaviorEvent event) {
LOGGER.info(this.getDiagramData());
}
public int getDiagramdata() {
return diagramdata;
}
public void setDiagramdata(int diagramdata) {
if(diagramdata == 1 || diagramdata == 2) {
this.diagramdata = diagramdata;
}
}
}
但是当我更改一个值时,jsf 生命周期会执行 2 次。第一次 in.getValue 为空,第二次为 1 或 2(来自 LOGGER)。但最后我的 h:outputText 打印 0...
要调试,我使用BalusC:调试 JSF 生命周期
为什么 te Lifecycle 会执行 2 次?
如何使用我的 selectOneButton 正确呈现其他列?
编辑:肮脏的解决方案
我找到了解决问题的方法(很脏!!!)。我将 p:ajax 组件更改为 f:ajax。所以现在我的值在第二个生命周期阶段被设置为正确的值。
<p:selectOneButton value="#{graph.diagramdata}" id="diagramdata">
<f:selectItem itemLabel="WAS-Diagramm" itemValue="1" />
<f:selectItem itemLabel="PSC-Diagramm" itemValue="2" />
<f:ajax listener="#{graph.changeView }" render="options"/>
</p:selectOneButton>
我还在我的 setter 方法中添加了一个 if 语句,以避免设置“0”。
现在第一个 jsf 生命周期什么都不做,第二个设置我的值。
它可以工作,但不是很好......