我正在使用<p:commandButton>
具有更新属性的标签,并在更新属性中传递当前元素 ID 作为 currentForm: messages
。类似:update="currentForm: messages"
。其中消息是 id
的<div>
我想在请求调用后更新的元素。
这工作正常。
现在,我创建了一个复合组件,其命令按钮与主模板中的命令按钮相同,并用创建的自定义命令按钮替换了 PrimeFaces 命令按钮。 (目前,在创建的命令按钮中没有进行任何自定义更改,只是在此面素面命令按钮)
当我渲染模板时,它向我提示给定的 ID 更新属性错误,如下所示:
javax.faces.FacesException: Cannot find component with expression "currentForm
如果我给出该元素的完整元素 ID 路径,它会再次起作用。
虽然如果我们为元素提供完整的元素 ID 路径是很好的,但令我惊讶的是为什么它在我调用直接 PrimeFaces 命令按钮时起作用?
最佳答案
这是因为复合组件就像 <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”错误。另请参阅此相关问题: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" ... />
关于jsf - JSF 自定义组件中的更新属性需要完整的元素 ID 路径,而直接 PrimeFaces 组件则使用短元素 ID 路径运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27800701/