9

我有两个 Tab 的 Primefaces TabView,例如:

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

它工作正常,除了当我更改选项卡时,服务器上的 activeIndex 没有更新,它总是返回默认值。我正在使用 primefaces 2.2.1。

谢谢你。

4

3 回答 3

14

通过PrimeFaces ShowCase 示例,如果您给每个选项卡一个 id:

<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 中获取该选项卡 ID。

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

然后你就会知道选择了哪个选项卡。


编辑:

有一个开放的 PrimeFaces问题 1640 TabView: Wrong activeIndex in TabChangeListener,在您遇到的问题上始终为 0。


编辑2:

对于 PrimeFaces 5.0 及更高tabChangeListener版本,该元素不再可用,tabView但应通过带有 tabChange 事件的显式 ajax 标记使用。

 <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 可以正常工作。

于 2011-03-07T20:46:22.017 回答
6

这对我有用:

public void onTabChange(TabChangeEvent event) {
        Tab activeTab = event.getTab();
        tabPanelIndex = ((TabView)event.getSource()).getChildren().indexOf(activeTab);
    }
于 2018-01-17T09:50:35.900 回答
3

dynamic尽管这个问题与 PrimeFaces 2.2.1 有关,但我想提一下,在现代 PrimeFaces 版本(使用 6.2 版测试)中,当属性设置为truecache设置为时,无需触发单独的事件false。By using this attribute combination the active index is automatically updated on the server when another tab is selected.

小面:

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

豆:

@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
    }

}
于 2018-09-23T16:23:56.920 回答