1

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

它可以工作,但不是很好......

4

2 回答 2

2

onchange="submit()"那里有什么?是否有机会提交表单?如果是这样,则将其删除...

此外,您确定需要immediate="true"您计划跳过验证吗?

于 2012-07-23T11:42:36.300 回答
1

似乎是 PrimeFaces selectOneButton 的错误。当我使用例如 p:selectOneMenu 时,它适用于 1 个 JSF 生命周期!

这是 primefaces 的已知问题

于 2012-07-25T06:46:19.407 回答