jsf - JSF 自定义组件中的更新属性需要完整的元素 ID 路径,而直接 PrimeFaces 组件则使用短元素 ID 路径运行

标签 jsf primefaces composite-component commandbutton

我正在使用<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 ),那么您可以考虑以下替代方法来更新消息组件:

  1. 动态传递目标客户端 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!)

  2. 或者只是让 PrimeFaces 在每个 ajax 请求上自动更新消息组件:

    <my:compositeButton ... />
    ...
    <p:messages autoUpdate="true" ... />
    

关于jsf - JSF 自定义组件中的更新属性需要完整的元素 ID 路径,而直接 PrimeFaces 组件则使用短元素 ID 路径运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27800701/

相关文章:

CSS 从 richfaces 3 迁移到 richfaces 4

JSF 复合组件接口(interface)标记 "expert"属性。它是做什么用的?

css - 带有自定义 css 文件的 primefaces

jsf-2 - 在支持组件中访问 JSF2 复合组件属性

java - JSF 数据表不显示任何数据

css - 将 div 元素置于另一个 div 元素的中心

jsf - 调用一个 Javascript 函数来点击一个(隐藏的)按钮或链接

java - 我可以确定是否在复合组件中定义了 JSF2 构面吗?

java - Eclipse 无法解析抽象类类型的复合组件属性

java - 在 JavaServer Faces 中导航,使用正确的参数进行重定向