2012-01-02 2 views
2

Свойство primfaces activeIndex всегда получает нуль.Primefaces tabView свойство activeIndex всегда получает нуль

Мой view.jsf:

<h:form> 
<p:growl id="growl" showDetail="true" /> 
<p:tabView > 
<p:ajax event="myForm" listener="#{employeeEdit.onTabChange}" /> 
<p:tab id="basic" title="Login"> 
</p:tab> 
<p:tab id="personal" title="Personal"> 
</p:tab> 
<p:tab id="contact" title="Contact"> 
</p:tab> 
</p:tabView> 

Мой edit.jsf:

<h:form prependId="false" > 
<p:tabView id="myid" activeIndex="#{employeeEdit.tabIndex}" > 
<p:tab id="basic" title="Login"> 
</p:tab> 
<p:tab id="personal" title="Personal"> 
</p:tab> 
<p:tab id="contact" title="Contact"> 
</p:tab> 
</p:tabView> 

Резервное боб: EmployeeEdit.java:

@Component("employeeEdit") 
@ViewScoped 
@Repository 
public class EmployeeEdit implements Serializable{ 

    /** 
    * 
    */ 
    private static final long serialVersionUID = -2784529548783517864L; 
    private EmployeeDTO employeeDTO = new EmployeeDTO(); 
    public static HibernateTemplate hibernateTemplate; 
    private int tabIndex; 

    @Autowired 
    public void setSessionFactory(SessionFactory sessionFactory) 
    { 
     System.out.println("in SessionFactory" +sessionFactory); 
     this.hibernateTemplate = new HibernateTemplate(sessionFactory); 
     System.out.println("in SessionFactory" +hibernateTemplate); 

    } 


    public int onTabChange(TabChangeEvent event) { 

     System.out.println("tab id = " + event.getTab().getId()+event.getTab().getTitle()); 
     if(event.getTab().getId().equals("personal")) 
     { 
      tabIndex =0; 
     } 
     else if(event.getTab().getId().equals("address")) 
     { 
      tabIndex =1; 
     } 
     else 
     { 
      tabIndex =2; 
     } 
     System.out.println("tabIndex = "+tabIndex); 
     return tabIndex; 
    } 



    public void edit() throws IOException 
    { 

     FacesContext.getCurrentInstance().getExternalContext().redirect("/employeeedit.jsf"); 
    } 



    public void cancel() throws IOException 
    { 
     FacesContext.getCurrentInstance().getExternalContext().redirect("/employeelist.jsf"); 
    } 

    public EmployeeDTO getEmployeeDTO() { 
     return employeeDTO; 
    } 

    public void setEmployeeDTO(EmployeeDTO employeeDTO) { 
     this.employeeDTO = employeeDTO; 
    } 

    public int getTabIndex() { 
     return tabIndex; 
    } 

    public void setTabIndex(int tabIndex) { 
     this.tabIndex = tabIndex; 
    } 
} 

Но всегда получаю TabIndex = 0; Почему это происходит? AJAX работает нормально. Но при нажатии кнопки «Изменить» на странице просмотра tabIndex получает нуль. в view.jsf, моя кнопка команда

<p:commandButton value="Edit" actionListener="#{employeeEdit.edit}" /> 

Моя primefaces версия: primefaces-3.0.M3 с Google Cloud SQL

+0

Можете ли вы опубликовать весь управляемый bean-компонент ('EmployeeEdit')? Прямо сейчас вы только разместили часть, которую вы говорите, работает. –

+0

Да, я разместил выше. –

+1

Что произойдет, если вы создадите свой 'EmployeeEdit'' SessionScoped'? –

ответ

0
public void edit() throws IOException { 
    FacesContext.getCurrentInstance().getExternalContext().redirect("/employeeedit.jsf"); 
} 

Ваш edit метод выше, перенаправляет на новый взгляд , тогда ваш @ViewScoped уничтожен. Так что, когда она конкретизируется снова, tabIndex инициализируется 0 (поскольку 0 является значением по умолчанию для int с в Java.)

Как следует из названия @ViewScoped хорошо для одной из точек зрения, когда хотите какой-то ППР на такой же взгляд. Таким образом, он уничтожается, когда вы перенаправляетесь на другое представление.

В таком случае вы можете использовать @SessionScoped, который длится до тех пор, пока длится сеанс.

+0

Когда я помещаю AJAX event = "tabChange", слушатель работает. Когда я не изменил свою вкладку, появится предыдущий индекс вкладки. Это потому, что '' private int tabIndex; 'не установлен в 0 в следующий раз« EmployeeEdit.java »'. Как я могу это решить? –

1

На самом деле, я думаю, вам может не понадобиться использовать bean-фасоль @SessionScoped. На самом деле, это может быть большой тратой ресурсов, если вы не будете повторно использовать данные в этом компоненте очень часто.

Я думаю, вы должны держать свой фасоль @ViewScoped и использовать <f:param>. Вы можете попробовать это:

<p:tabView id="myid" activeIndex="#{param.tabIndex}" > 
    ... 
</p:tabView> 

<p:commandButton value="Edit" action="employeeedit" ajax="false"> 
    <f:param name="tabIndex" value="#{employeeEdit.tabIndex}" /> 
</p:commandButton> 

Это может сэкономить вам некоторые ресурсы, и вам не нужна функция edit только для перенаправления пользователя YO редактирования страницы.

+0

«В вашей функции перенаправления мне кажется, что вы перенаправляетесь на одну и ту же страницу редактирования». Нет, он фактически перенаправляется из 'view.jsf' в' edit.jsf'. –

+0

@ βнɛƨнǤʋяʋиɢ: спасибо за исправление меня ^^. Я обновил свой ответ. –

+0

+1. Этот выглядит лучше, чем мой. –

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