Iframe的目标更新

时间:2013-01-03 11:19:00

标签: jsf-2 primefaces

我在<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>上的内容时更新iframe内容。原始代码在ajax标记上有@form,并且正在更新整个表单并将用户放回第一个选项卡。

如何让ajax更新iframe而不会搞乱活动标签?

3 个答案:

答案 0 :(得分:0)

使用

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

还将myIframe设置为您的框架的ID。我还建议您使用<ui:repeat />代替c:forEach,它有时会破坏您的观点。见question

答案 1 :(得分:0)

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

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

然而,正如@Petr Mensik所说,我建议你避免使用任何类型的jsp标签,例如c:ifc:forEach,除非你确定你在做什么,因为这种标签被渲染之前比其他人。

答案 2 :(得分: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>