我在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: Debug JSF Lifecycle
为什么te生命周期会进行2次?
如何使用selectOneButton正确渲染其他列?
编辑:DIRTY SOLUTION
我找到了解决问题的方法(很脏!!!)。 我将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生命周期什么也没做,第二个设置我的值。
它有效,但不是很好......
答案 0 :(得分:2)
你在那里onchange="submit()"
是什么?是否有机会提交表格?如果是,那么删除它......
另外,您确定需要immediate="true"
是否计划跳过验证?
答案 1 :(得分:1)
看起来像PrimeFaces selectOneButton的错误。 当我使用例如p:selectOneMenu它适用于1 JSF Lifecycle!
以下是来自primefaces的已知issue。