3

我有以下 UI Primefaces 片段:

<pou:growl id="growl" 
               redisplay="false"
               showDetail="false" 
               sticky="false" />

当我尝试更新此项目时,例如这样:

<pou:commandButton value="Update" 
                   update=":growl"/>

一切正常。

然而,当我将咆哮移动到复合组件并尝试调用它时(即像这样):

<ez:growl/>

我收到一条错误消息,上面写着:

javax.faces.FacesException: Cannot find component with identifier ":growl" referenced from "j_idt84:j_idt85:testForm:j_idt111".

我的问题是为什么要添加所有这些自动生成的名称以及如何控制它们以便我可以实际访问要更新的组件?

4

1 回答 1

14

这是因为复合组件本质上是从UINamingContainer(如 as <h:form><h:dataTable>等)扩展而来的,因此在其子组件的客户端 ID 前面加上了自己的 ID。

为了实现您的特定功能需求,首先给您的复合组件一个固定的 ID:

<ez:growl id="growl"/>

然后将<p:growl>复合组件的实现嵌入到一个普通的 HTML 容器元素中,例如<div><span>使用复合组件的客户端 ID 作为元素 ID:

<cc:implementation>
    <span id="#{cc.clientId}">
        <p:growl />
    </span>
</cc:implementation>

现在您可以使用update=":growl"通常的方式。

于 2012-07-27T15:15:49.163 回答