JSF 2 / Primefaces p:在onchange事件被触发后ajax没有更新面板

时间:2012-06-23 04:55:40

标签: jsf-2 primefaces

我在过去的两天里一直坚持这一点,并且很难理解Primefaces如何根据他们的ID更新客户端上的UI组件。

我有一个h:selectOneMenu,其中包含要显示的面板数量的计数。每个p:面板将包含一个带有多个表单元素的panelGrid。下拉的onchange事件被触发,我可以在Managed Bean中看到计数。我没有看到面板在客户端动态增加。我认为我的p:ajax params有问题,但我不完全理解它是如何工作的。这是相关的代码:

    <h:selectOneMenu id="numapps" value="#{mbean.appCount}">
                <f:selectItem itemLabel="1" itemValue="1" />
                <f:selectItem itemLabel="2" itemValue="2" />
                <f:selectItem itemLabel="3" itemValue="3" />
                <f:selectItem itemLabel="4" itemValue="4" />
                <f:selectItem itemLabel="5" itemValue="5" />
                <p:ajax update="appsContainer" event="change"   
                    listener="#{mbean.onChangeNumApps()}" />    
    </h:selectOneMenu>

    <p:panel id="appsContainer" >
           <p:panel header="Application" id="appsPane" value="#{mbean.submittedApps}" var="app" multiple="true">

submittedApps是一个包含面板表单元素的List。这是我的mbean监听器:

public void onChangeNumApps()
{
    List<Apps> c = new ArrayList<Apps>();
    logger.info("on change event fired");
    logger.info("new value is "+mbean.getAppCount());
    for (int i=0;i < mbean.getAppCount();i++)
    {
        c.add(new App());
    }
    mbean.setSubmittedApps(c);
}

我正在混合p:ajax和h:selectone因为我无法得到p:selectone因某种原因而工作 - 可能是因为我的样式表与CSS碰撞了?

2 个答案:

答案 0 :(得分:0)

从JSF树添加/删除动态组件要简单得多。 虽然我主要研究RF和JSF2.0,但是我无法在Primefaces的代码方面为你提供太多帮助,但我可以列出根据从接收到的数字添加动态组件可以遵循的步骤。 valuechange listener。

在您的帖子中,您需要根据

提交的值获得动态数量的表单元素

对于valuechanelistener,您可以获取所选面板数量的值。

  1. 您在valuechangelistener中创建了一个新面板。
  2. 根据从valuechangelistener收到的号码创建所需的表单元素。
  3. 将这些元素作为子元素添加到面板中。
  4. 将此面板作为孩子添加到之前在页面上显示的面板上。
  5. 您可以使用JSF内置的uniqueID函数,而不是手动为每个动态组件分配ID,这将自动为您提供唯一的ID。 如果您需要进一步使用动态组件来提取值,那么您需要将ID存储在一个单独的集合中,然后根据ID,您可以获取动态组件的值。

    获取组件的唯一ID: -

      。

    FacesContext.getCurrentInstance()getViewRoot()createUniqueId();

    要动态地将组件添加到JSF树,请找到下面提到的代码段: -

    HtmlPanelGrid panelGrid=new HtmlPanelGrid();
    panelGrid.setColumns(2);
    String uniqueId=FacesContext.getCurrentInstance().getViewRoot().createUniqueId();
    panelGrid.setId(uniqueId);    arrLstComponentIds.add(uniqueId);
    HtmlInputText inputText = new HtmlInputText();    
    HtmlOutputLabel outputLabel=new HtmlOutputLabel();
                                              panelGrid.getChildren().add(outputLabel);
    panelGrid.getChildren().add(inputText);
    htmlGridElement = new HtmlPanelGrid();      htmlGridElement.getChildren().add(panelGrid); 
    

    您需要重新渲染面板,以便反映JSF树中的更改。

答案 1 :(得分:0)

使用ui:重复而不是遍历面板。