Primefaces不会在AJAX更新时呈现子组件

时间:2014-06-24 14:39:09

标签: java ajax jsf primefaces

我目前正在使用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());
    }
}

1 个答案:

答案 0 :(得分:1)

用JSF的内置PanelGrid替换PrimeFace的HTMLPanelGrid解决了这个问题。