我正在使用像这样的p:tab视图
<ui:composition template="./WEB-INF/templates/masterTemplate.xhtml">
<ui:define name="windowTitle">
#{msgs.home}
</ui:define>
<ui:define name="content">
<p:tabView id="tabView" dynamic="false">
<p:tab id="tab1" title="#{msgs.home}">
<ui:include src="/homePages/home.xhtml" />
</p:tab> <!--end of tab1 -->
<p:tab id="tab2" title="#{msgs.join}">
<ui:include src="/homePages/join.xhtml" />
</p:tab> <!--end of tab2 -->
<p:tab id="tab3" title="#{msgs.signIn}">
<ui:include src="/homePages/login.xhtml" />
</p:tab> <!--end of tab3 -->
</p:tabView>
</ui:define>
</ui:composition>
这是我的join.xhtml页面
<h:body>
<ui:composition>
<div id="join" style="border-style:solid; border-width:5px; padding: 10px;" >
<div id="joinFormPosition" class="left">
<h:form id="joinForm">
<h:outputText id="joinMessgae" value="#{msgs.joinMessgae}" />
<span class="asterisk">*</span><span class="labels">#{msgs.signInName}: </span>
<p:inputText id="name"
value="#{joinPage.signInName}"
required="true"/>
<p:message for="name" />
...
<div id="submitButton">
<h:commandButton id="submitBtn"
value="Submit"
actionListener="#{join.saveUser}" />
</div>
</h:form>
</div> <!--end of joinFormPosition -->
</div> <!--end of join -->
</ui:composition>
</h:body>
login.xhtml
<ui:composition>
<div id="login" style="border-style:solid; border-width:5px; padding: 10px;" >
<div id="loginFormPosition" class="left">
<h:form id="loginForm">
<h:outputText value="#{msgs.signIn}" />
.....
<div id="signInButton">
<h:commandButton id="signInBtn"
value="Submit"
actionListener="#{login.signIn}"
action ="#{login.outcome}"/>
</div>
</h:form>
</div> <!--end of loginFormPosition -->
</div> <!--end of login -->
</ui:composition>
如果我在标签联接上然后提交表单,如果任何验证失败,那么我切换到第一个标签。我希望如果我点击提交按钮,验证是否失败,我会留在同一个标签上。我在登录选项卡上遇到的情况相同。提交表格后,我如何留在同一个标签上?
由于
答案 0 :(得分:3)
您可以将tabview绑定到辅助bean上的tabview对象,并在那里设置活动索引。
<p:tabView binding="#{myTabBean.messagesTab}">
然后在myTabBean上:
private TabView messagesTab = new TabView();
public TabView getMessagesTab () {
return messagesTab;
}
public void setMessagesTab(TabView messagesTab ) {
this.messagesTab = messagesTab;
}
public void someDecisionMethod(){
int idx=1
this.messagesTab.setActiveIndex(idx);
}
答案 1 :(得分:0)
我知道这个问题已经过时了,但几年之后我只是面对同样的问题,使用了primefaces 5.2。对于您的特定情况,可能有多种解决方案,例如仅更新选项卡的内容而不是整页。但我真的不得不重新加载整个页面(区域设置更改):
要“记住”activeTab,您基本上只需要在视图范围的managedBean中绑定activeIndex并指定p:ajax事件侦听器。但是由于你的p:tabView不在表单中,并且标签本身有自己的表单,因此存在一些已知问题:https://github.com/primefaces/primefaces/issues/695最简单的解决方法是将p:ajax的partialSubmit设置为true。因此,只需设置activeIndex并保留在选项卡上即可:
XHTML:
<p:tabView activeIndex="#{myManagedBean.activeTabIndex}">
<p:ajax event="tabChange" partialSubmit="true" />
myManagedBean:
//plus its getter and setter
private Integer activeTabIndex;
编辑:仅指定<p:ajax event="tabChange" partialSubmit="true" />
可能就足够了,甚至不绑定activeIndex。至少对我的用例来说已经足够了。