提交表格后如何留在同一个标​​签上

时间:2012-05-11 11:21:43

标签: primefaces

我正在使用像这样的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>

如果我在标签联接上然后提交表单,如果任何验证失败,那么我切换到第一个标签。我希望如果我点击提交按钮,验证是否失败,我会留在同一个标​​签上。我在登录选项卡上遇到的情况相同。提交表格后,我如何留在同一个标​​签上?

由于

2 个答案:

答案 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。至少对我的用例来说已经足够了。