我在表单中使用复合组件,并且我想使用ajax调用,当复合组件值更改时,要重置的相关字段的模型值以及要再次呈现的相应组件(空)。但似乎我只能为组件设置渲染;不是为了另一个;我一直在<f:ajax> contains an unknown id 'ticketForm:gfhId'
。
我有一个复合组件loc:Location
(简化)
<!DOCTYPE...
<html...
<h:body>
<composite:interface>
<composite:attribute name="visibleFieldValue" required="true" />
<composite:attribute name="hiddenFieldValue" required="true" />
<composite:clientBehavior name="changeLocation" event="click" targets="updateButton deleteButton"/>
</composite:interface>
<composite:implementation>
<div id="#{cc.clientId}">
<h:inputText id="visibleId" value="#{cc.attrs.visibleFieldValue}"
readonly="true" onfocus="#{rich:component('popUpPnl')}.show('', {top:'100px', left:'250px'});"/>
<h:inputHidden id="hiddenId" value="#{cc.attrs.hiddenFieldValue}"
converter="es.caib.gesma.gesman.data.converter.LocationConverter" />
<a4j:commandButton id="deleteButton"
image="/resources/images/icons/textfield_delete.png" alt="Borrar"/>
<h:commandButton id="updateButton" value="Update"/>
...
</composite:implementation>
</body>
</html>
该组件在ticketForm
格式内使用,如下所示:
<loc:location id="locationId"
hiddenFieldValue="#{ticketCtrl.ticket.location}"
visibleFieldValue="#{ticketCtrl.ticket.locationDescription}">
<f:ajax event="changeLocation" render="ticketForm:gfhId" execute="@this"
listener="#{ticketCtrl.locationListener}"/>
</loc:location>
将渲染设置为@all
或@form
会导致异常无法显示,但gfhId
组件未呈现(我认为它仅将其应用于复合组件)。
为了进行比较,我使用相同形式的inputText组件设置了所需的行为:
<h:inputText id="contactId" value="#{ticketCtrl.ticket.contactPerson}">
<a4j:ajax event="change" render=":ticketForm:gfhId"
execute="@this" listener="#{ticketCtrl.locationListener}"/>
</h:inputText>
有什么想法吗?提前谢谢。
答案 0 :(得分:3)
相对于父:
组件解析execute
和render
<f:ajax>
中所有相对客户ID(即那些不以NamingContainer
开头的)。复合组件隐式为NamingContainer
。所以它基本上在ticketForm:gfhId
的上下文中寻找<cc:implementation>
,但没有。
请改用绝对客户端ID。
<f:ajax ... render=":ticketForm:gfhId" />