我有一个包含两个选项卡的标签视图。
当我从选项卡1切换到选项卡2时,我会调用一些代码来执行验证并更新某些值。根据此验证的结果,我想要保留在选项卡1上,或转到选项卡2,并刷新选项卡内容。
我的标签视图:
<h:form id="form">
<p:tabView id="tabview" activeIndex="#{ctrl.idx}" dynamic="true" cache="false">
<p:ajax event="tabChange" listener="#{ctrl.doStuff}" update=":form:tabview"/>
<p:tab title="Tab 1" id="t1">
<h:panelGrid columns="1" cellpadding="10">
<h:outputText value="#{ctrl.s1}"/>
</h:panelGrid>
</p:tab>
<p:tab title="Tab 2" id="t2">
<h:panelGrid columns="1" cellpadding="10">
<h:outputText value="#{ctrl.s2}"/>
</h:panelGrid>
</p:tab>
</p:tabView>
</h:form>
我的测试代码仅仅改变了这些值:
public void doStuff() {
s1 = String.valueOf(Math.random());
s2 = String.valueOf(Math.random());
}
我认为我的方法中改变活动选项卡索引就足够了,像这样:
public void doStuff() {
// ...
idx = 0;
}
在 tabChange 事件中,该方法被调用,但 tabview 组件会跳转到被点击的选项卡,并忽略 idx 的新值。
我认为在
p:ajax
中添加 update 属性会渲染整个 tabview,但实际上只会重新渲染选项卡和/或选项卡内容。最奇怪的是,如果我将
update=":form:tabview"
更改为 update=":form"
或 update="@form"
,我只能在 AJAX 响应中收到选项卡内容 -> 组件从页面中消失了!我的 Bean 是视图范围内的,我正在使用 Primefaces 3.5、JSF 2.1 和 Tomcat 7。
有什么想法吗?谢谢。
tabIndex=#{yourbean.idx}
。 - KukeltjeactiveIndex="#{myBean.tabIndex}"
而不是tabIndex
。 - Addison