我在过去的两天里一直坚持这一点,并且很难理解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碰撞了?
答案 0 :(得分:0)
从JSF树添加/删除动态组件要简单得多。 虽然我主要研究RF和JSF2.0,但是我无法在Primefaces的代码方面为你提供太多帮助,但我可以列出根据从接收到的数字添加动态组件可以遵循的步骤。 valuechange listener。
在您的帖子中,您需要根据
提交的值获得动态数量的表单元素对于valuechanelistener,您可以获取所选面板数量的值。
您可以使用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:重复而不是遍历面板。