我在<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而不会搞乱活动标签?
答案 0 :(得分:0)
使用
<p:ajax process="@this" event="change" update="myIframe" />
还将myIframe
设置为您的框架的ID。我还建议您使用<ui:repeat />
代替c:forEach
,它有时会破坏您的观点。见question
答案 1 :(得分:0)
您可以尝试将iframe放在h:panelGroup
或p:panel
中,然后按整个表单的顺序更新panelGroup。
作为替代方法,您可以在支持bean中更新维护所选选项卡索引的表单,因此重新呈现不会再次导致转到第一个选项卡。
然而,正如@Petr Mensik所说,我建议你避免使用任何类型的jsp标签,例如c:if
或c: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>