0

我发现使用 JSF 2.0 和 Ajax 功能的奇怪行为。如果在 c:forEach 块中加载子页面,Ajax 似乎不再起作用。

我正在使用一个包含一组动态子页面的主表单(基于后端配置):

<c:forEach items="#{workflowController.editorSections}" var="section">
    <div class="imixs-portlet" >
        <ui:include src="/pages/workitems/parts/#{section.url}.xhtml"/>
    </div>
</c:forEach>

在这种情况下,不可能使用简单的 f:ajax render"..." 标签。

例如,以下代码片段仅适用于 c:forEach 标签中包含的第一个子页面:

<h:commandButton value="Welcome Me">
        <f:ajax execute="name" render="output" />
</h:commandButton>
<h:outputText id="output" value="#{childWorkitemController.name}" />

如果我尝试在第一个子页面之后包含的子页面中使用 f:ajax,那么在这个子页面中 ajax 将不再起作用。

因此,目前我唯一可行的解​​决方案是跳过 c:forEach 块并手动包含所有子页面。

当子页面包含在 ac:forEach 块中时,为什么 ajax 行为会中断?

4

1 回答 1

0

问题是我没有为我的子页面使用 ui:composition 标签。

这是我之前子页面的结构

<f:subview xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:fn="http://java.sun.com/jsp/jstl/functions" id="mysubpage">

<h:panelGroup layout="block" styleClass="imixs-form-section"
        id="minutes_body" binding="#{minutesBody}">
....

</f:subview>

在我变成 ui:composition 之后,一切正常!

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:fn="http://java.sun.com/jsp/jstl/functions">

<h:panelGroup layout="block" styleClass="imixs-form-section"
        id="minutes_body" binding="#{minutesBody}">
....

</ui:composition>

使用 ui:composition 标签,我的子页面可以包含在任何情况下,并且 ajax 可以按预期工作。只有在一种情况下,仍然需要用 af:subview 元素包围子页面的一部分。否则,我会收到一个带有消息的警报框:

malformedXML:更新期间:workitem_form:form_panel:j_idt179 未找到

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:fn="http://java.sun.com/jsp/jstl/functions">

<!-- subview tag necessary here -->
<f:subview>

    <!-- minutes body -->
    <h:panelGroup layout="block" styleClass="imixs-form-section"
        id="minutes_body" binding="#{minutesBody}">
.....
    </f:subview>
 </ui:composition>
于 2013-05-12T08:56:07.353 回答