2014-01-07 3 views
3

Я использую Primefaces 3.5 и столкнулся с проблемой смены ActiveIndex. ActiveIndex не меняется при переходе между вкладками. Это мой TabMenu код:Изменение ActiveIndex в TabMenu

<h:form id="formMenu"> 
<p:tabMenu id="tabMenu" activeIndex="#{toolbarBean.currentTab}"> 
     <p:menuitem value="Main" action="#{toolbarBean.changeActiveIndex(0)}" /> 
     <p:menuitem value="Page2" action="#{toolbarBean.changeActiveIndex(1)}" /> 
     <p:menuitem value="Page3" actionListener="#{toolbarBean.changeActiveIndex(2)}" /> 
     <p:menuitem value="Page4" action="#{toolbarBean.changeActiveIndex(3)}" /> 
    </p:tabMenu> 
    </form> 

toolbarBean.java

@Named 
@SessionScoped 
public class toolbarBean implements Serializable { 

private int currentTab; 

public int getCurrentTab() { 
    return currentTab; 
} 

public void setCurrentTab(int currentTab) { 
    this.currentTab = currentTab; 
} 

public String changeActiveIndex(int currentTab) { 
    this.currentTab = currentTab; 
    switch (currentTab) { 
    case 0: 
     return "/main"; 
    case 1: 
     return "/page2"; 
    case 2: 
     return "/page3"; 
    case 3: 
     return "/page4"; 
    default: 
     return "/page5"; 
    } 
} 

}

Часть действия работает должным образом, когда переменная currentTab получает присваивается нужное значение. Однако, как только он запускает страницу переадресации страницы, панель инструментовBean сбрасывается, а activeIndex снова запускается с 0. Кто-нибудь есть идеи о том, что я делаю неправильно?

+0

Итак, что вы хотите сделать? – nosnhoj

+0

Я бы хотел, чтобы он менял активный индекс вкладки, так что вкладка текущей страницы рассматривается как активная для пользователя. – gdawgrancid

+0

Почему бы вам не использовать, как в витрине? Поместите ссылку на страницу в свойство «url» для p: menuitem, вместо того, чтобы управлять им в вашем компоненте. Посмотрите: http://www.primefaces.org/showcase/ui/tabMenuSupport.jsf – Pellizon

ответ

0

Посмотрите на мой ответ на этот вопрос:

How to change activeindex in TabMenu

Я думаю, это то, что вы ищете.

Edit: Вот полный ответ:

Я нашел решение в PrimeFaces витрине. Вы можете добавить параметр запроса в элемент меню и добавить этот параметр к своему URL-адресу. Поэтому для поддержания активного индекса не требуется бэк-компонент:

<p:tabMenu activeIndex="#{param.i}"> 
    <p:menuitem value="Home" icon="ui-icon-home" url="page1.xhtml?i=0"> 
     <f:param name="i" value="0" /> 
    </p:menuitem> 
    <p:menuitem value="Search" icon="ui-icon-search" url="page2.xhtml?i=1"> 
     <f:param name="i" value="1" /> 
    </p:menuitem> 
    ... 
</p:tabMenu> 
+0

Хотя эта ссылка может ответить на вопрос, лучше укажите основные части ответа здесь и укажите ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. –

+0

Извините, я был немного ленив ;-) – QueryLars

+0

Еще лучше отметить вопрос как дубликат – Mark

0

Я безуспешно пытался воспроизвести ошибку.

Я считаю, что образец кода, который я использовал, имеет функции, которые вам нужны. Проверьте это:

* The View

<p:layout fullPage="true"> 
    <p:layoutUnit position="north" size="100" header="Top" resizable="true" closable="true" collapsible="true"> 
     <h:form id="formMenu"> 
      <p:tabMenu id="tabMenu" activeIndex="#{toolbarBean.currentTab}"> 
       <p:menuitem value="Main" action="#{toolbarBean.changeActiveIndex(0)}" /> 
       <p:menuitem value="Page2" action="#{toolbarBean.changeActiveIndex(1)}" /> 
       <p:menuitem value="Page3" action="#{toolbarBean.changeActiveIndex(2)}" /> 
       <p:menuitem value="Page4" action="#{toolbarBean.changeActiveIndex(3)}" /> 
      </p:tabMenu> 
     </h:form> 
    </p:layoutUnit> 

    <p:layoutUnit position="south" size="100" header="Bottom" resizable="true" closable="true" collapsible="true"> 
     <h:outputText value="South unit content." /> 
    </p:layoutUnit> 

    <p:layoutUnit position="west" size="200" header="Left" resizable="true" closable="true" collapsible="true"> 
     <h:outputText value="West unit content." /> 
    </p:layoutUnit> 

    <p:layoutUnit position="east" size="200" header="Right" resizable="true" closable="true" collapsible="true" effect="drop"> 
     <h:outputText value="Right unit content." /> 
    </p:layoutUnit> 

    <p:layoutUnit position="center"> 
     MAIN 
    </p:layoutUnit> 
</p:layout> 

Управляемый Bean

import java.io.Serializable; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.SessionScoped; 

@ManagedBean 
@SessionScoped 
public class ToolbarBean implements Serializable { 

    private int currentTab; 

    public int getCurrentTab() { 
     return currentTab; 
    } 

    public void setCurrentTab(int currentTab) { 
     this.currentTab = currentTab; 
    } 

    public String changeActiveIndex(int currentTab) { 
     this.currentTab = currentTab; 
     switch (currentTab) { 
      case 0: 
       return "main"; 
      case 1: 
       return "page2"; 
      case 2: 
       return "page3"; 
      case 3: 
       return "page4"; 
      default: 
       return "page5"; 
     } 
    } 
} 

Обратите внимание, что ToolbarBean почти то же самое. Когда вы используете @Named, посмотрите, действительно ли ManagedBean в области сеанса.

Еще одна вещь, о которой стоит упомянуть, заключается в том, что main.xhml, page1.xhtml, page2.xhtml и т. Д. Имеет тот же контент, за исключением содержимого блока макета центра.

Смежные вопросы