2012-07-27 117 views
3

我有以下UI Primefaces片段:JSF更新复合组件(Primefaces)

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

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

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

,一切工作正常。

当我移动咆哮到然而复合成分,并尝试调用它(即是这样。):

<ez:growl/> 

我得到一个错误maessage,说:

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

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

回答

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"

+0

我有同样的问题,我不明白如何应用您的答案:我有一个组件包含在另一个xhtml内部,在内。你能告诉我如何加入我的案件吗?谢谢 ! – Ioan 2013-02-19 15:53:12

+0

@loan:你在使用复合组件吗? (例如,您使用的是,其中'cc'来自'http:// java.sun.com/jsf/composite')。 – BalusC 2013-02-19 15:55:46

+0

不,我有一个简单的main.xhtml,其中包含和一个,以及之一:。该表单位于内部。就这样。它一直工作,直到我添加菜单标签查看部分.. – Ioan 2013-02-19 15:59:14