Primefaces tabView свойство activeIndex всегда становится нулевым - PullRequest
2 голосов
/ 02 января 2012

Primefaces tabView Свойство activeIndex всегда становится нулевым.

My 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 работает нормально. Но при нажатии кнопки «Изменить» на странице просмотра вкладка «Индекс» становится нулевой. в view.jsf моя командная кнопка

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

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

Ответы [ 2 ]

1 голос
/ 02 января 2012

На самом деле, я думаю, вам не нужно использовать @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 только для перенаправления пользователя на страницу редактирования.

0 голосов
/ 02 января 2012
public void edit() throws IOException {
    FacesContext.getCurrentInstance().getExternalContext().redirect("/employeeedit.jsf");
}

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

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

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

...