我有一个自定义组件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 的答案正确之后,如果有人想检查代码,它也在这里: