2012-03-28 4 views
6

Der aktive Index wird nicht automatisch aktualisiert. ReaD in ein paar Posts, dass durch die tabView auf ein Formular funktioniert. Oder indem Sie <p:ajax event="tabChange"/> in der Tabansicht einfügen, funktioniert es. Aber nichts scheintAktiver Index der tabview wird nicht automatisch aktualisiert

xhtml

Probe 1 zu arbeiten: automatische Updates

<p:tabView id="categoryTabView" var="promoArticle" value="#{promotionDetailBean.artDTOs}" activeIndex="#{promotionDetailBean.activeTabIndex}"> 
      <p:tab id="categoriesTab" title="#{promoArticle.categoryName}"> 
       <p:dataTable id="promotionDetail_dataTable" var="articlePromo" value="#{promoArticle.artVO}" selection="#{promotionDetailBean.selectedArt}" rowIndexVar="rowIndex"> 
        <p:column id="select" selectionMode="multiple" /> 

        <p:column id="barCode"> 
         <h:inputText id="barCodeInputTxt" value="#{articlePromo.barCode}" 
         styleClass="inputTextStyle" onchange="onSuggestedValueChange('categoryTabView',#{promotionDetailBean.activeTabIndex}, 'promotionDetail_dataTable',#{rowIndex},'originalCostInputTxt')" /> 
        </p:column> 
       </p:dataTable> 
      </p:tab> 
     </p:tabView> 

Probe 2: Aktualisierung auf tabChange Ereignis

<h:form id="form"> 
    <p:growl id="growlm" showDetail="true" /> 

      <p:tabView id="categoryTabView" var="promoArticle" value="#{promotionDetailBean.artDTOs}" > 
       <p:ajax event="tabChange" listener="#{promotionDetailBean.tabChanged}" update=":growlm" /> 
        <p:tab id="categoriesTab" title="#{promoArticle.categoryName}"> 
         <p:dataTable id="promotionDetail_dataTable" var="articlePromo" value="#{promoArticle.artVO}" selection="#{promotionDetailBean.selectedArt}" rowIndexVar="rowIndex"> 
          <p:column id="select" selectionMode="multiple" /> 

          <p:column id="barCode"> 
           <h:inputText id="barCodeInputTxt" value="#{articlePromo.barCode}" 
           styleClass="inputTextStyle" onchange="onSuggestedValueChange('categoryTabView',#{promotionDetailBean.activeTabIndex}, 'promotionDetail_dataTable',#{rowIndex},'originalCostInputTxt')" /> 
          </p:column> 
         </p:dataTable> 
        </p:tab> 
       </p:tabView> 

Ich muss die Zelle auf "OnChange" -Ereignis identifizieren. Aber der activeIndex ist immer 0, der initialisierte Wert. Das Ereignis wird nicht angerufen.

bean

private Integer activeTabIndex = 0; 
public Integer getActiveTabIndex() { 
    return activeTabIndex; 
} 
public void setActiveTabIndex(Integer activeTabIndex) { 
    this.activeTabIndex = activeTabIndex; 
} 

bean

public void tabChanged(TabChangeEvent event){ 
     TabView tv = (TabView) event.getComponent(); 
     this.activeTabIndex = tv.getActiveIndex(); 
    } 

Aber das Ereignis trigerred immer nicht. Wird auch nicht automatisch aktualisiert.

Was könnten die wahrscheinlichen Probleme sein?

Danke, Shikha

Antwort

5

Die folgende arbeitete für mich:

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:

public final void onTabChange(final TabChangeEvent event) { 
    TabView tv = (TabView) event.getComponent(); 
    this.activeTabIndex = tv.getActiveIndex(); 
} 
+1

Das scheint nur zu funktionieren, wenn [aktiver Index nicht an die verwaltete Bean gebunden ist] (http://code.google.com/p/primefaces/issues/detail? id = 1640 & q = activeIndex & colspec = ID% 20Stars% 20Modul% 20Typ% 20Status% 20Priorität% 20TargetVersion% 20Reporter% 20Owner% 20Zusammenfassung). Ich bin erstaunt, dass das Team von Primefaces es noch nicht gelöst hat (ich arbeite mit Version 3.5). Es funktioniert jedoch, wenn das 'tabView' selbst in ein Formular eingewickelt wird, anstatt für jede Registerkarte ein Formular zu haben. –

+2

this.activeTabIndex = tv.getActiveIndex(); funktioniert nicht. Stattdessen können Sie this.activeTabIndex = tv.getChildren() verwenden. IndexOf (event.getTab()); – ahmet

+0

Index beginnt mit 0 oder 1? – xav56883728

0
<p:column id="barCode"> 
    <h:inputText id="barCodeInputTxt" value="#{articlePromo.barCode}" 
      styleClass="inputTextStyle" onchange="onSuggestedValueChange('categoryTabView', 
    #{promotionDetailBean.activeTabIndex}, 
    'promotionDetail_dataTable',#{rowIndex}, 
    'originalCostInputTxt')" /> **_____/>_____** 
</p:column> 
  1. Sie haben eine extra />
  2. sofortige wahre Problem mit p verursachen: Ajax, sollten Sie sofort wahr verwenden, wenn Sie haben die Validierung nicht oder Sie versuchen, den Vorgang abzubrechen.

    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> 
    

Dies funktioniert aber aktiv Index 0.

+0

extra /> ist ein Tippfehler .. Ich habe es auch sofort versucht. Funktioniert nicht. –

+0

Ich habe Ihr Beispiel jetzt versucht, aber activeIndex ist immer 0. Vielleicht bin ich falsch mit etwas, aber ich muss es versuchen. Auch ich werde meine Antwort bearbeiten Sie sollten es überprüfen. – utkusonmez

0

in Ihrem xhtml ist Sie Hörer rufen = "# {promotionDetailBean. onTabChange}", aber in Ihrem Bean der Methodenname ist „public void tabChanged ". So kann es nicht auslösen.

Ich habe ein Beispiel auf prime-Vitrine bei versucht:

in 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); 
} 

in XHTML (tabviewChangeListener.xhtml):

<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"> 

Das Ergebnis ist wie erwartet: an den zweiten Registerkarte beginnt, wird angezeigt. Ich klicke auf den ersten Tab und dann auf den dritten. SYSOUT ist:

-------- 0

-------- 0

-------- 2

---- ---- 2

+0

Auch der Setter von activeTabIndex, setActiveTabIndex(), wird mit korrektem Indexwert aufgerufen. – dasgin

+0

und in xhtml sollten Sie tabView in h einfügen: Formularkomponente – dasgin

2

Das nur, wenn active index is not binded to the managed bean scheint zu funktionieren. Aber das ist nutzlos für mich, da ich eine Back-Bean-View-Synchronisation halten möchte. Ich bin erstaunt Primefaces Team hat es noch nicht gelöst (ich arbeite mit Version 3.5). Es funktioniert jedoch, wenn die p:tabView selbst in eine h:form verpackt ist, anstatt eine von ihnen für jede Registerkarte zu haben, aber das ändert den Submit-Kontext.

11

Dies funktioniert für mich, wenn die Lasche nicht in einer Form, sondern jeder Tab enthält enthalten ist seine eigene ein:

  1. einen Zuhörer auf die Registerkarte Änderungsereignis Ihre TabView Komponente hinzufügen:

    <p:ajax event="tabChange" listener="#{userBean.onTabChange}" />
  2. Das Abrufen des aktiven Index von der zugrundeliegenden TabView-Komponente scheint nicht zu funktionieren. Doch in dem Fall, wird die neuen ausgewählten Registerkarte korrekt aktualisiert, so dass wir Index durch die Suche in den Kindern Komponenten der TabView getthe können:

 
    public void onTabChange(TabChangeEvent event) 
    { 
     TabView tabView = (TabView) event.getComponent(); 
     activeTab = tabView.getChildren().indexOf(event.getTab()); 
    } 

ich diese Hoffnung für Sie arbeitet zu

0

i einfache Lösung dieses mit:

public void onSPTabChange(TabChangeEvent event) 
{ 
    TabView tabView = (TabView) event.getComponent(); 
    currentData.setSP_Index(tabView.getChildren().indexOf(event.getTab())+1); 
} 

in Current i Eigenschaft SP_Index mit der Anzahl der Register haben (erste, zweite ....)

<p:tabView id="tabView" styleClass="tabView"> 
<p:ajax event="tabChange" listener="#{dataAccess.onSPTabChange}" /> 
.... 

und jquery Skript

<script> 
    $("#tabView li:nth-child(#{currentData.SP_Index})").click(); 
</script> 
4

Für primefaces> = 5.0 benutzen Sie bitte den folgenden Code hinzu:

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

Scheint Android :) – delive

-1
public final void onTabChange(final TabChangeEvent event) { 
    TabView tv = (TabView) event.getComponent(); 
    this.activeTabIndex = tv.getIndex(); 
} 

Dieser arbeitete für mich ...

+0

Wie unterscheidet sich das in den anderen Antworten? – Kukeltje