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或任何其他素数面组件,它就可以工作了。我正在努力使它与h:dataTable一起工作。

Primefaces 8.0、JSF 2.5

看看这个简单的例子:

<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="tablewrapper"组件。让我们试试clientIdupdate="form:table"。就像update="table"一样,什么都不会发生。并且PF没有错误(因此可以找到元素(。这可能意味着h:dataTable无法从内部正确地重新渲染(但我不想扔石头:-((。JSF第三方组件库中的弹出窗口就是这种情况。

在这个特定的例子中,我想说,您必须更新form:wrapper(添加form:工作(或仅更新@form才能使其工作。有了你的代码,一切都会一样。尝试更新某些表父级或整个表单。


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

顺便说一句。我不知道有JSF 2.5:-(

最新更新