JSF更新复合组件(Primefaces)

3

我有以下的UI Primefaces代码片段:

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

当我试图更新此项时,例如像这样:
<pou:commandButton value="Update" 
                   update=":growl"/>

一切正常。

然而,当我将Growl移动到一个组合组件中并尝试调用它(即像这样):

<ez:growl/>

我收到一个错误信息,内容是:
javax.faces.FacesException: Cannot find component with identifier ":growl" referenced from "j_idt84:j_idt85:testForm:j_idt111".

我的问题是为什么会添加所有这些自动生成的名称,我该如何控制它们,以便我可以实际访问组件并进行更新?
1个回答

14

这是因为复合组件本质上是从UINamingContainer(例如<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" 即可。


我有同样的问题,但我不太明白如何应用你的答案:我有一个<ui>组件包含在另一个xhtml中,在<p:tabView>内部。你能告诉我如何适应我的情况吗?谢谢! - Ioan
@loan:你是否在使用组合组件?(即,您正在使用<cc:interface><cc:implementation>,其中cc来自http://java.sun.com/jsf/composite)。 - BalusC
不,我有一个简单的main.xhtml文件,其中包含<p:growl id="growl"/>和一个<p:tabView,里面有更多的<p:tab>,在其中一个<p:tab>中我做了:<ui:include src="form.xhtml" />。这个表单位于ui:composition中。就是这样。在我添加菜单选项卡视图部分之前它是工作正常的。 - Ioan
1
@loan:那么这个答案根本不适用于您。继续搜索或提出新问题。同时,如果您遇到问题中提到的错误消息,则可能适用此通用答案:https://dev59.com/62oy5IYBdhLWcg3wUcVL#8644762 - BalusC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接