1

我在表单中使用了复合组件,并且我想使用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>

有任何想法吗?提前致谢。

4

1 回答 1

3

和of中的所有相对客户端 ID(即不以 开头的:)都是相对于父组件解析的。复合组件隐含地是 a 。所以它基本上是在 的上下文中寻找,但没有。executerender<f:ajax>NamingContainerNamingContainerticketForm:gfhId<cc:implementation>

请改用绝对客户端 ID。

<f:ajax ... render=":ticketForm:gfhId" />

也可以看看:

于 2012-09-13T14:27:00.357 回答