Primefaces tabview的活动索引未自动更新

Primefaces tabview的活动索引未自动更新,primefaces,tabview,Primefaces,Tabview,活动索引未自动更新。在一些帖子中读到,通过将选项卡视图放在表单上,它可以工作。或者通过在选项卡视图中包含,它可以工作。但似乎什么都不管用 xhtml 示例1:自动更新 bean private Integer activeTabIndex = 0; public Integer getActiveTabIndex() { return activeTabIndex; } public void setActiveTabIndex(Integer activeTabIndex) {

活动索引未自动更新。在一些帖子中读到,通过将选项卡视图放在表单上,它可以工作。或者通过在选项卡视图中包含
,它可以工作。但似乎什么都不管用

xhtml

示例1:自动更新

bean

private Integer activeTabIndex = 0;
public Integer getActiveTabIndex() {
   return activeTabIndex;
}
public void setActiveTabIndex(Integer activeTabIndex) {
    this.activeTabIndex = activeTabIndex;
}
public void tabChanged(TabChangeEvent event){
        TabView tv = (TabView) event.getComponent(); 
        this.activeTabIndex = tv.getActiveIndex();
    }
但这一事件并没有被触发。也不会自动更新

可能的问题是什么

谢谢, 什喀


**_____/>_____**
  • 您有一个额外的/>
  • 即时true可能会导致p:ajax出现问题,当您没有验证或尝试取消操作时,应该使用即时true

    public void tabChange(TabChangeEvent event){
         TabView tabView = (TabView) event.getComponent();
         Tab tab = (Tab) event.getTab();
         String tabChangedMessage = tab.getTitle() + " changed. index=" + tabView.getActiveIndex();
         System.out.println(tabChangedMessage);
         FacesContext fc = FacesContext.getCurrentInstance();
         fc.addMessage(null, new FacesMessage("Tab changed", tabChangedMessage));
    }
    
    <p:tabView>
       <p:ajax event="tabChange" listener="#{tabChangeBean.tabChange}" update=":growlId" />
       <p:tab title="tab 1">
       tab1 inside
       </p:tab>
       <p:tab title="tab 2">
       tab1 inside
       </p:tab>
    </p:tabView>
    
    公共作废tabChange(TabChangeEvent事件){
    TabView TabView=(TabView)event.getComponent();
    Tab=(Tab)event.getTab();
    字符串tabChangedMessage=tab.getTitle()+“changed.index=“+tabView.getActiveIndex();
    System.out.println(tabChangedMessage);
    FacesContext fc=FacesContext.getCurrentInstance();
    fc.addMessage(空,新面孔消息(“Tab已更改”,tabChangedMessage));
    }
    内表1
    内表1
    

  • 这可以工作,但活动索引为0

    在xhtml中,您调用的是listener=“#{promotionDetailBean.onTabChange>”,但在您的bean中,方法名称是“public voidtabchange”。所以它不能触发

    我在prime showcase上尝试了一个示例:

    在bean中(TabBean):

    private Integer activeTabIndex = 1;
    
    // setter/getter
    
    public void onTabChange(TabChangeEvent event) {
        FacesMessage msg = new FacesMessage("Tab Changed", "Active Tab: " + event.getTab().getTitle());
    
        TabView tabView = (TabView) event.getComponent(); 
        int activeTabIndex = tabView.getActiveIndex();
        System.out.println("--------" + activeTabIndex);
    
    
        FacesContext context = FacesContext.getCurrentInstance();
        Map<String, String> params = context.getExternalContext().getRequestParameterMap();
        String activeIndexValue = params.get(tabView.getClientId(context) + "_activeIndex");
        System.out.println("--------" + activeIndexValue);
    
        context.addMessage(null, msg);
    }
    
    <p:tabView id="tabView" dynamic="true" activeIndex="#{tabBean.activeTabIndex}">
    
                    <p:ajax event="tabChange" listener="#{tabBean.onTabChange}" update=":form:growl"/>
    
                    <p:tab title="Godfather Part I" id="Godfather1">
    
    private Integer activeTabIndex=1;
    //二传手
    公共无效onTabChange(TabChangeEvent事件){
    FacesMessage msg=新的FacesMessage(“选项卡已更改”,“活动选项卡:”+event.getTab().getTitle());
    TabView TabView=(TabView)event.getComponent();
    int activeTabIndex=tabView.getActiveIndex();
    System.out.println(“----------”+activeTabIndex);
    FacesContext context=FacesContext.getCurrentInstance();
    Map params=context.getExternalContext().getRequestParameterMap();
    字符串activeIndexValue=params.get(tabView.getClientId(上下文)+“\u activeIndex”);
    System.out.println(“----------”+activeIndexValue);
    addMessage(null,msg);
    }
    
    在xhtml中(tabviewChangeListener.xhtml):

    private Integer activeTabIndex = 1;
    
    // setter/getter
    
    public void onTabChange(TabChangeEvent event) {
        FacesMessage msg = new FacesMessage("Tab Changed", "Active Tab: " + event.getTab().getTitle());
    
        TabView tabView = (TabView) event.getComponent(); 
        int activeTabIndex = tabView.getActiveIndex();
        System.out.println("--------" + activeTabIndex);
    
    
        FacesContext context = FacesContext.getCurrentInstance();
        Map<String, String> params = context.getExternalContext().getRequestParameterMap();
        String activeIndexValue = params.get(tabView.getClientId(context) + "_activeIndex");
        System.out.println("--------" + activeIndexValue);
    
        context.addMessage(null, msg);
    }
    
    <p:tabView id="tabView" dynamic="true" activeIndex="#{tabBean.activeTabIndex}">
    
                    <p:ajax event="tabChange" listener="#{tabBean.onTabChange}" update=":form:growl"/>
    
                    <p:tab title="Godfather Part I" id="Godfather1">
    
    
    
    结果与预期一致: 开始时,将显示第二个选项卡。我单击第一个选项卡,然后单击第三个选项卡。sysout是:

    --------0

    --------0

    --------二,


    --------2

    以下几点对我很有用:

    XHTML:

    <p:tabView id="categoryTabView" var="promoArticle"
            value="#{promotionDetailManagedBean.articuloPromocionDTOs}" dynamic="true">
        <p:ajax event="tabChange" listener="#{promotionDetailManagedBean.onTabChange}" />
        <p:tab> ... </p:tab>
    </p:tabView>
    

    这似乎只适用于以下情况。但是这对我来说是无用的,因为我想保持一个备份bean视图同步。我很惊讶Primefaces团队还没有解决它(我正在使用3.5版本)。但是,如果
    p:tabView
    本身被包装到
    h:form
    中,而不是每个选项卡都有一个选项卡,则它会起作用,但这会使您更改提交上下文。

    当选项卡不包含在表单中,但每个选项卡都包含自己的选项卡时,这对我有效:

  • 将侦听器添加到tabView组件的选项卡更改事件:

    <p:ajax event="tabChange" listener="#{userBean.onTabChange}" />
  • 从底层TabView组件获取活动索引似乎不起作用。但是,在这种情况下,新选定的选项卡会正确更新,因此我们可以通过在选项卡视图的子组件中搜索来获取索引:

  • 公共无效onTabChange(TabChangeEvent事件) { TabView TabView=(TabView)event.getComponent(); activeTab=tabView.getChildren().indexOf(event.getTab()); } 我希望这也适用于您

    我可以通过以下方法轻松解决此问题:

    public void onSPTabChange(TabChangeEvent event) 
    {   
        TabView tabView = (TabView) event.getComponent();
        currentData.setSP_Index(tabView.getChildren().indexOf(event.getTab())+1);
    }
    
    在currentdata中,我有属性SP_索引和选项卡编号(第一,第二…)

    
    ....
    
    并添加jquery脚本

    <script>
        $("#tabView li:nth-child(#{currentData.SP_Index})").click();
    </script>
    
    
    $(“#tabView li:n子项(#{currentData.SP_Index})”)。单击();
    
    对于primefaces>=5.0 请使用以下代码:

    public final void onTabChange(TabChangeEvent event) {
        TabView tv = (TabView) event.getComponent();     
        this.ActiveIndex = tv.getChildren().indexOf(event.getTab());
    }
    

    这对我很有用…

    extra/>是一个打字错误。。我也曾尝试过,但没有立即停止。不起作用。我现在已经尝试了你的示例,但activeIndex始终为0。也许我有什么地方做错了,但我必须尝试一下。此外,我将编辑我的答案,您应该检查它。另外,activeTabIndex的setter setActiveTabIndex()是使用正确的索引值调用的。在xhtml中,您应该将tabView放在h:form组件中,该组件似乎只有在以下情况下才起作用。我很惊讶Primefaces团队还没有解决这个问题(我正在使用3.5版本)。但是,如果
    选项卡视图
    本身被包装成一个表单,而不是每个选项卡都有一个表单,那么它就可以工作;不起作用。相反,您可以使用这个.activeTabIndex=tv.getChildren().indexOf(event.getTab());索引以0或1开头?这与其他答案有什么不同?似乎是Android:)
    public void onSPTabChange(TabChangeEvent event) 
    {   
        TabView tabView = (TabView) event.getComponent();
        currentData.setSP_Index(tabView.getChildren().indexOf(event.getTab())+1);
    }
    
    <p:tabView id="tabView" styleClass="tabView">  
    <p:ajax event="tabChange" listener="#{dataAccess.onSPTabChange}" />
    ....
    
    <script>
        $("#tabView li:nth-child(#{currentData.SP_Index})").click();
    </script>
    
    public final void onTabChange(TabChangeEvent event) {
        TabView tv = (TabView) event.getComponent();     
        this.ActiveIndex = tv.getChildren().indexOf(event.getTab());
    }
    
    public final void onTabChange(final TabChangeEvent event) {
        TabView tv = (TabView) event.getComponent();
        this.activeTabIndex = tv.getIndex();
    }