0

在过去的两天里,我真的被这个问题困扰着,并且正在努力理解 Primefaces 如何根据他们的 ID 更新客户端上的 UI 组件。

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

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

submitApps 是一个包含面板表单元素的列表。这是我的 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 与我的样式表发生冲突?

4

2 回答 2

0

从 JSF 树中添加/删除动态组件要简单得多。虽然我主要研究 RF 和 JSF2.0,所以在 primefaces 的代码方面我无法为您提供太多帮助,但我可以列出根据从值变化监听器。

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

为此,您可以在 valuechanelistener 上获取所选面板数量的值。

  1. 您在 valuechangelistener 中创建一个新面板。
  2. 根据从 valuechangelistener 收到的数字创建所需的表单元素。
  3. 将这些元素作为子元素添加到面板中。
  4. 将此面板作为子面板添加到先前页面上存在的面板中。

您可以使用 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 树中的更改。

于 2012-06-23T08:18:31.857 回答
0

让它与 ui:repeat 一起工作,而不是在面板上迭代。

于 2012-06-23T09:11:52.950 回答