我正在使用带有update属性的<p:commandButton>
标记,并将更新属性中的当前元素ID作为currentForm: messages
传递。类似于:update="currentForm: messages"
。其中message是我要在请求调用后更新的id
<div>
元素。
这很好。
现在我使用与主模板中相同的命令按钮创建了一个复合组件,并用创建的自定义命令按钮替换了PrimeFaces命令按钮。 (现在没有在创建的命令按钮中进行任何自定义更改,只需在此处使用prime faces命令按钮)
当我渲染模板时,它向我抱怨给出更新属性错误的ID:
javax.faces.FacesException: Cannot find component with expression "currentForm
如果我为此元素提供完整的元素ID路径,它将再次起作用。
虽然我们给元素提供完整的元素ID路径是好的,但是当我调用直接的PrimeFaces命令按钮时它为什么会让我感到惊讶?
答案 0 :(得分:2)
那是因为复合组件类似于<h:form>
,<h:dataTable>
等,也是命名容器。它们对ajax客户端ID的影响在相关问题中列出:How to find out client ID of component for ajax update/render? Cannot find component with expression "foo" referenced from "bar"。
这样做是因为否则会遇到重复的组件ID&#34;在同一命名容器父级中多次重用复合组件时复合组件实现的错误。另请参阅此相关问题:Should a composite component really require namingcontainer interface?
如果您绝对肯定复合组件是具体要求的正确解决方案,因此不是标记文件(许多启动器因过零配置性质而过度使用复合组件,while it should really best only be used if you intend to bind a single model property to a bunch of closely related components ),那么您可以考虑以下替代方法来更新消息组件:
动态传递目标客户端ID:
<my:compositeButton ... update=":#{messages.clientId}" />
...
<p:messages binding="#{messages}" ... />
(注:the code is as is; you don't need to bind it to a bean property or so!)
或者让PrimeFaces在每个ajax请求上自动更新消息组件:
<my:compositeButton ... />
...
<p:messages autoUpdate="true" ... />