JSF更新复合组件(Primefaces)

tar*_*rka 3 jsf primefaces composite-component

我有以下UI Primefaces片段:

<pou:growl id="growl" 
               redisplay="false"
               showDetail="false" 
               sticky="false" />
Run Code Online (Sandbox Code Playgroud)

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

<pou:commandButton value="Update" 
                   update=":growl"/>
Run Code Online (Sandbox Code Playgroud)

一切正常.

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

<ez:growl/>
Run Code Online (Sandbox Code Playgroud)

我得到一个错误消息说:

javax.faces.FacesException: Cannot find component with identifier ":growl" referenced from "j_idt84:j_idt85:testForm:j_idt111".
Run Code Online (Sandbox Code Playgroud)

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

Bal*_*usC 14

这是因为复合材料部件本身从扩展UINamingContainer(如如<h:form>,<h:dataTable>等),因此在前面加上他们的孩子与自己的ID的客户端ID.

要实现您的特定功能需求,请首先为复合组件提供固定ID:

<ez:growl id="growl"/>
Run Code Online (Sandbox Code Playgroud)

然后将<p:growl>复合组件的实现嵌入到纯HTML容器元素中,<div>或者<span>将复合组件的客户端ID作为元素ID 嵌入:

<cc:implementation>
    <span id="#{cc.clientId}">
        <p:growl />
    </span>
</cc:implementation>
Run Code Online (Sandbox Code Playgroud)

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