вкладка простых лицПросмотреть проблему activeIndex - PullRequest
7 голосов
/ 07 марта 2011

У меня есть Primefaces TabView с двумя Tab, например:

<p:tabView dynamic="true" cache="false"
           onTabShow="scrollBottom(#{stanzaBean.activeIndex})"
           tabChangeListener="#{messaggioBean.onTabChange}"
           activeIndex="#{stanzaBean.activeIndex}" >

, он работает нормально, за исключением того, что при изменении вкладки activeIndex не обновляется на сервере и всегда возвращает значение по умолчанию.Я использую простые лица 2.2.1.

Спасибо.

Ответы [ 3 ]

11 голосов
/ 07 марта 2011

По примеру PrimeFaces ShowCase , если вы присваиваете каждой вкладке идентификатор:

<p:tabView tabChangeListener="#{indexBean.onTabChange}" >
    <p:tab title="tab 0" id="tab0"></p:tab>
    <p:tab title="tab 1" id="tab1" ></p:tab>
    <p:tab title="tab 2" id="tab2"></p:tab>               
</p:tabView>

вы можете получить этот идентификатор вкладки в tabChangeListener.

public void onTabChange(TabChangeEvent event) {       
    System.out.println("tab id = " + event.getTab().getId());
}

Тогда вы узнаете, какая вкладка была выбрана.


Edit:

Существует открытая проблема PrimeFaces 1640 TabView: неверный activeIndex в TabChangeListener, всегда 0 для проблемы, с которой вы столкнулись.


Редактировать 2:

С PrimeFaces 5.0 и выше tabChangeListener больше не доступен для элемента tabView, но должен использоваться через явный тег ajax с событием tabChange.

 <p:tabView id="analysisSections" value="#{analysisBean.analysis.sections}" var="section" activeIndex="#{analysisBean.activeIndex}">
      <p:ajax event="tabChange" listener="#{analysisBean.onTabChange}"/>

Также вы можете напрямую получить индекс вкладки:

public void onTabChange(TabChangeEvent event) {
    activeIndex = ((TabView) event.getSource()).getIndex();
}

со всеми этими изменениями activeIndex работает правильно.

5 голосов
/ 17 января 2018

это сработало для меня:

public void onTabChange(TabChangeEvent event) {
        Tab activeTab = event.getTab();
        tabPanelIndex = ((TabView)event.getSource()).getChildren().indexOf(activeTab);
    }
1 голос
/ 23 сентября 2018

Хотя вопрос был связан с PrimeFaces 2.2.1, я хотел бы отметить, что в современных версиях PrimeFaces (протестированных с версией 6.2) нет необходимости инициировать отдельное событие, когда атрибут dynamic установлен на true и cache установлено на false. При использовании этой комбинации атрибутов активный индекс автоматически обновляется на сервере при выборе другой вкладки.

Facelet:

<p:tabView activeIndex="#{stanzaBean.activeIndex}"
           cache="false"
           dynamic="true">

Bean:

@Named
@ViewScoped
public class StanzaBean implements Serializable {

    private int activeIndex;

    public int getActiveIndex() {
        return activeIndex;
    }

    /**
     * Automatically called whenever a tab changes and dynamic="true"
     * and cache="false".
     */
    public void setActiveIndex(int activeIndex) {
        this.activeIndex = activeIndex;

        // do other stuff when tab changes
    }

}
...