【发布时间】:2012-02-03 19:39:39
【问题描述】:
我正在构建一个发票应用程序。当用户选择客户端时,与客户端关联的服务会通过 ajax 事件在 dataTable 中重新呈现。但是,dataTable中selectOneMenu的ajax事件不会触发。
这是让用户选择客户端的表单:
<h:form>
<h:selectOneMenu id="clientSelect" value="#{invoiceBean.client}">
<f:ajax execute="clientSelect" listener="#{invoiceServiceListener.processClientValueChange}" render=":test :invoiceData"/>
<f:selectItems value="#{invoiceBean.clientOptions}"/>
</h:selectOneMenu>
</h:form>
这将触发一个 ajax 事件,该事件填充 invoiceBean 中的 services 数组并重新呈现 dataTable,该 dataTable 在 dataTable 的另一个 selectOneMenu 中显示服务。这部分工作正常。
这是上面表格选择客户端后重新渲染的数据表:
<h:panelGroup id="test">
<h:dataTable id="invoiceData" value="#{attributes.priceAttributes}" var="loop">
<h:column>
<ui:param name="service" value="service#{loop}" />
<ui:param name="description" value="description#{loop}" />
<ui:param name="price" value="price#{loop}" />
<h:form id="invoiceSelectMenu">
<h:selectOneMenu id="selectMenu" value="#{invoiceBean[service]}">
<f:ajax event="change" execute="selectMenu" listener="#{invoiceServiceListener.procesServiceValueChange}" render="@form" />
<f:attribute name="row" value="#{loop}" />
<f:selectItems value="#{invoiceBean.services}" />
</h:selectOneMenu>
<h:inputText id="description" value="#{invoiceBean[description]}" />
<h:inputText id="price" value="#{invoiceBean[price]}" />
<h:outputText value="#{loop}" />
</h:form>
</h:column>
</h:dataTable>
</h:panelGroup>
selectOneMenu 已正确填充。但是,这个选择一个菜单中的 ajax 事件在它被第一个表单重新呈现后不起作用。但是,如果我手动填充服务数组而不提交第一个表单,那么这个 ajax 事件会正常执行。顺便说一句,这个 ajax 事件还为描述和价格输入字段设置了一个值,当事件发生时应该重新渲染。 invoiceBean 是请求范围内的。
【问题讨论】:
-
在将所有
<和>替换为[和]之前,为什么没有阅读编辑帮助中的邮件格式规则? -
如果您在 DOM 元素上有事件处理程序并将其替换为 AJAX 内容,则不再附加事件。这是这里的问题吗?
-
对不起,我不太熟悉这个 DOM 术语。你能详细说明一下吗?我该如何解决这个问题?如果您有关于此问题的链接,请分享。我自己很好地阅读了它,当我在谷歌上搜索时,我找不到有用的链接。谢谢。
-
感谢您修复代码格式。但总的来说,这个问题很难理解。我重新缩进了代码,从代码中删除了所有噪音(不相关的标签/属性),并用更好理解的英语重写了问题。请检查这是否确实是您真正要问的。
-
是的。这是我的问题,巴鲁斯先生。