0

我在<c:forEach>迭代器中更新 iframe 时遇到一些问题:

<h:form>
    <p:outputPanel rendered="#{dd.render()}">
        <p:tabView dynamic="true">
        <c:forEach var="aba" items="#{dd.abas}">
        <p:tab title="#{aba.orelha}" >
        <h2>
            <h:outputText value="#{aba.titulo}" />
            <p:selectOneMenu style="width:250px;  float:right;" value="#{aba.ln}" rendered="#{aba.selecaoAtiva}">
            <f:selectItems value="#{aba.itens}" />
             <p:ajax update="WHAT SHOULD GO HERE???" event="change" />
        </p:selectOneMenu>
        </h2>
            <f:view>
                <iframe src="very-Boring-And-Long-E.L.-Built-URL" width="#{dd.largura}" frameborder="0" height="#{dd.altura}" />
            </f:view>
            </p:tab>
        </c:forEach>
        </p:tabView>
    </p:outputPanel>
</h:form>

当用户在<p:selectOneMenu>. 原始代码@form在 ajax 标记上,并且正在更新整个表单并将用户放回第一个选项卡。

如何让 ajax 更新 iframe 而不会弄乱活动选项卡?

4

3 回答 3

0

采用

<p:ajax process="@this" event="change" update="myIframe" /> 

也设置myIframe为你的框架的ID。我还建议您使用<ui:repeat />而不是c:forEach,它有时会破坏您的视图。看到这个问题

于 2013-01-03T11:36:39.283 回答
0

您可以尝试将 iframe 放在h:panelGrouporp:panel中,然后按整个表单的顺序更新 panelGroup。

作为替代方案,您可以更新在支持 bean 中维护选定选项卡索引的表单,因此重新呈现不会导致再次转到第一个选项卡。

但是,正如@Petr Mensik 所说,我建议您避免使用任何类型的 jsp 标签,c:if或者c:forEach除非您确定自己在做什么,否则会导致此类标签比其他标签更早呈现。

于 2013-01-03T13:11:23.427 回答
0

这个答案可能与我的情况特别相关,但我想出的解决方案是让它按预期工作。

如果有人可以提出更优雅的答案,那将被接受。
同时...


将表单标签移动到 中<p:tab>,因为标签不需要相互混淆。

让 ajax 更新@form,它可以工作。

<p:outputPanel rendered="#{dd.render()}">
<p:tabView dynamic="true">
    <c:forEach var="aba" items="#{dd.abas}">
        <p:tab title="#{aba.orelha}" >
            <h:form>
                <h2>
                    <h:outputText value="#{aba.titulo}" />
                    <p:selectOneMenu style="width:250px;  float:right;" value="#{aba.ln}" rendered="#{aba.selecaoAtiva}">
                        <f:selectItems value="#{aba.itens}" />
                         <p:ajax update="@form" event="change" />
                </p:selectOneMenu>
                </h2>
                <f:view>
                    <iframe src="very-Boring-And-Long-E.L.-Built-URL" width="#{dd.largura}" frameborder="0" height="#{dd.altura}" />
                </f:view>
            </h:form>
        </p:tab>
    </c:forEach>
</p:tabView>
</p:outputPanel>
于 2013-01-03T13:13:47.707 回答