首页 > 解决方案 > Primefaces 8.0 JSF 不更新表

问题描述

当我单击 addTagButton 时,一切正常。它更新所有三个组件:标签、tagId 和 addTagButton。

    <p:commandButton id="addTagButton" icon="ui-icon-plus"
            action="#{searchBean.addTag}" 
            update="tags, tagId, addTagButton"
            disabled="#{searchBean.tagChoices.size() == 0}">
    </p:commandButton>
    

这是表格组件:

    <h:dataTable id="tags" var="tag" value="#{searchBean.tags}">
        <h:column>
            <div style="text-align:right;">
                <h:outputLabel value="#{tag.typeName}:"/>
            </div>
        </h:column>
        <h:column>
            <p:inputText id="tag" size="25" value="#{tag.typeValue}"
                disabled="#{searchBean.searchForParent}"/>
        </h:column>
        <h:column>
            <p:commandButton id="delTagButton" icon="pi pi-trash" 
                action="#{searchBean.deleteTag}"
                update=":contentForm:tagId, :contentForm:addTagButton, tags">
                <f:setPropertyActionListener 
                    target="#{searchBean.tagId}" 
                    value="#{tag.typeName}" />
            </p:commandButton>
        </h:column>
    </h:dataTable>

当我单击标签表中每一行上的 delTagButton 时,操作正常,:contentForm:tagId 和 :contentForm:addTagButton 更新正常。但是点击命令按钮所在的标签表不会更新。

删除行时,更改必须反映在不起作用的标签表中。

现在,如果我将 h:dataTable 更改为 p:dataTable 或任何其他 primefaces 组件,它就可以工作。我正在尝试使其与 h:dataTable 一起使用。

Primefaces 8.0,JSF 2.5

标签: jsfprimefacesajax-update

解决方案


看看这个简单的例子:

<h:form id="form">
    <h:panelGroup id="wrapper" layout="block">
        <h:dataTable id="table" border="1" value="#{testBean.list}" var="person">
            <h:column>#{person.name}</h:column>
            <h:column>#{person.surname}</h:column>
            <h:column>
                <p:commandButton id="delTagButton" icon="pi pi-trash" 
                    action="#{testBean.remove(person)}" update="table">
                </p:commandButton>
            </h:column>
        </h:dataTable>
    </h:panelGroup>
</h:form>

要真正了解正在更新的内容,请查看浏览器控制台。

如果你试图update="table"什么都没有发生(比如在你的代码中)。如果您尝试更新表的父级(通常是这种情况),您将收到错误错误:

SEVERE: Error Rendering View[/example.xhtml]
org.primefaces.expression.ComponentNotFoundException: Cannot find component for expression "wrapper" referenced from "form:table:0:delTagButton".
at org.primefaces.expression.SearchExpressionFacade.cannotFindComponent(SearchExpressionFacade.java:677)

所以我们可以尝试“年长”的父母并意识到这很update="@form"有效!好的,所以我们想帮助找到id="table\wrapper"组件。让我们试试 clientId update="form:table"。就像update="table"什么都没发生一样。并且 PF 没有错误(因此可以找到该元素)。这可能意味着h:dataTable无法从内部正确重新渲染(但我不想扔石头:-))。例如,JSF 3rd 方组件库中的弹出窗口通常就是这种情况。

在这个特定的例子中,我会说,你必须更新form:wrapper(添加form:作品)或者只是@form为了让它工作。使用您的代码将是相同的。尝试更新某些表父级或整个表单。


以上所有都在 JSF 2.2 中进行了测试,最后一个 RF,一个旧的 PF 和 OmniFaces。但我认为新版本也是如此。

顺便提一句。我不知道有 JSF 2.5 :-)


推荐阅读