我目前正在使用Primefaces 5.0开发JSF应用程序,其中面板的内容应根据当前的SelectOneMenu选择动态更新。
当所选项目发生更改时,将调用Java方法,该方法按其ID搜索面板,删除所有当前子组件并将其替换为新组件。
这一切都正常工作:调用该方法,通过其ID找到面板,并替换子组件。但由于某种原因,子小部件永远不会出现在UI上。我已经检查了HTTP响应,他们也在那里失踪了
有什么想法吗?
JSF代码如下所示:
<p:panel>
<p:selectOneMenu id="artikelFilter" value="#{artikelListController.artikelFilter}" converter="omnifaces.SelectItemsConverter">
<p:ajax event="change" update="createFilterPanel" />
<f:selectItem itemLabel="" itemValue="#{null}" />
<f:selectItems value="#{artikelListController.artikelFilterValues}" />
</p:selectOneMenu>
<p:panelGrid id="createFilterPanel" />
<p:commandButton action="#{artikelListController.addArtikelFilter()}" value="Hinzufügen" disabled="#{artikelListController.artikelFilter == null}" style="margin-left: 15px" />
</p:panel>
和这样的Java代码:
public void setArtikelFilter(final Class<? extends ArtikelFilter> clazz) {
PanelGrid createFilterWidget = (PanelGrid) FacesContext.getCurrentInstance().getViewRoot().findComponent("artikelListForm:createFilterPanel");
if (clazz == null) {
artikelFilter = null;
createFilterWidget.getChildren().clear();
}
else if (artikelFilter == null || clazz != artikelFilter.getClass()) {
artikelFilter = constructor().in(clazz).newInstance();
createFilterWidget.getChildren().clear();
createFilterWidget.getChildren().addAll(artikelFilter.getCreateFilterWidgets());
}
}
答案 0 :(得分:1)
用JSF的内置PanelGrid
替换PrimeFace的HTMLPanelGrid
解决了这个问题。