当我单击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:-(