【问题标题】:primefaces tabView activeIndex issueprimefaces tabView activeIndex 问题
【发布时间】:2011-07-10 12:26:25
【问题描述】:

我有两个 Tab 的 Primefaces TabView:

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

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

谢谢。

【问题讨论】:

  • 你在tabChangeListener中做了什么?
  • 在 tabChangeListener 我想更新一些数据。我需要 activeIndex 来检索正确的数据。

标签: jsf indexing primefaces tabview


【解决方案1】:

通过PrimeFaces ShowCase example,如果你给每个标签一个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 issue 1640 TabView: Wrong activeIndex in TabChangeListener, always 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}"/>

也可以直接获取tab的索引:

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

通过所有这些更改,activeIndex 可以正常工作。

【讨论】:

  • 这个变量似乎是用于活动标签的初始设置,不打算更新。
  • 我得到了索引-1使用((TabView) event.getSource()).getIndex()
【解决方案2】:

这对我有用:

public void onTabChange(TabChangeEvent event) {
        Tab activeTab = event.getTab();
        tabPanelIndex = ((TabView)event.getSource()).getChildren().indexOf(activeTab);
    }

【讨论】:

    【解决方案3】:

    虽然这个问题与 PrimeFaces 2.2.1 有关,但我想提一下,在现代 PrimeFaces 版本(使用 6.2 版测试)中,当属性 dynamic 设置为 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
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-28
      • 2018-03-11
      • 2013-03-17
      • 2015-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多