0

我有一个自定义组件location。我希望,当更改完成时,模型会更新,因此另一个组件(自动完成)将仅显示与该location值相关的结果。此外,该组件被重新渲染以重置它。

我有一个包含以下代码的页面(简化):

<h:form id="ticketForm">
  ...
  <loc:location id="locationId"                         <-- CUSTOM COMPONENT
    hiddenFieldValue="#{ticketCtrl.ticket.location}"
    visibleFieldValue="#{ticketCtrl.ticket.locationDescription}"
    rendered="#{ticketCtrl.ticketModifiable}">

    <f:ajax event="changeLocation" render=":ticketForm:gfhId"       <-- AJAX CALL.
      execute=":ticketForm:locationId" listener="#{ticketCtrl.locationListener}"/>
  </loc:location>
  ...
</h:form>

当组件中的值发生更改时,模型会:ticketForm:gfhId根据需要更新并渲染,但不会执行侦听器(执行额外的重置)。

将 ajax 附加到更简单的控件会导致执行侦听器;vg

<h:inputText id="contactId"
  value="#{ticketCtrl.ticket.contactPerson}"
  disabled="#{not ticketCtrl.ticketModifiable}">
  <f:ajax event="change" render=":ticketForm:gfhId"
    execute=":ticketForm:locationId" listener="#{ticketCtrl.locationListener}"/>
</h:inputText>

完美运行。

我不知道它是否可能与changeLocation事件的触发方式有关;在我的组件中,我将其定义为

<composite:interface>
   ...
   <composite:clientBehavior name="changeLocation" event="change" targets="visibleId"/>
</composite:interface>

visibleId作为只读文本;当它被 javascript 更改时,我change用 JS 在它上面触发事件。

function launchEvent(fieldName) {
  if ("fireEvent" in fieldName) {
    fieldName.fireEvent("onchange");
  } else {
    var evt = document.createEvent("HTMLEvents");
    evt.initEvent("change", false, true);
    fieldName.dispatchEvent(evt);
  }
}

我在其他问题中找到的信息是关于使 ajax 成为复合组件的内部部分,这里我希望 ajax 分离,因为我可能在组件的其他用途中不需要它。

我正在使用 JBoss 6.1 和 Mojarra 2.1.9 和 Richfaces 4。

提前致谢。

更新:

即使在找到 jarek.jpa 的答案正确之后,如果有人想检查代码,它也在这里:

复合组件 http://pastebin.com/9wqMVfR5

主窗体 http://pastebin.com/i39ys2D9

4

1 回答 1

1

这可能与设置为 true 的“readonly”属性有关。尽管您设法手动(JS)发送更改事件,但由于只读状态,侦听器的服务器端处理可能会被丢弃。参见例如jsf (richfaces) 只读输入文本验证

于 2012-09-19T19:49:58.147 回答