JSF自定义组件中的Update属性需要完整的元素ID路径,其中直接PrimeFaces组件以短元素ID路径运行

时间:2015-01-06 14:24:17

标签: jsf primefaces composite-component commandbutton

我正在使用带有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命令按钮时它为什么会让我感到惊讶?

1 个答案:

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

  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" ... />