2012-07-23 55 views
1

我在WebSphere Application Server上使用PrimeFaces 3.3.1和Apache MyFaces 2。 我的BackingBean是SessionScoped。 我有一个selectOneButton的窗体应该更新整个窗体。使用PrimeFaces执行2次JSF生命周期ajax

<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> 

编辑:PART支持bean

@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生命周期perfomed 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生命周期什么都没做,第二个设置我的值。

它的工作原理,但不是很精...

+0

你能发布更多的支持bean吗?例如,您可以参考in.getValue,但您并未在此处发布该代码。 – Catfish 2012-07-24 21:31:47

+0

我添加了支持bean的部分 – veote 2012-07-25 05:48:40

回答

1

看起来像PrimeFaces selectOneButton的错误。 当我使用例如p:selectOneMenu在1个JSF生命周期中工作正常!

这里是来自primefaces的已知issue

2

是什么onchange="submit()"你有吗?是否有机会做表格提交?如果是这样,然后删除它...

另外,你确定你需要immediate="true"你计划跳过验证?

+0

我删除了两个标签,但现在输入值都是“0”,当我第二次按下按钮时它工作 – veote 2012-07-23 11:59:16

+0

看一下这个:在'changeView'方法和地方删除所有代码'System.out.println(getDiagramdata();'看到正确的值吗?' – Daniel 2012-07-23 12:03:39

+0

我编辑了我的changeView方法,JSF生命周期也被执行了2次,两次我的值都是“0” – veote 2012-07-23 12:13:56