2012-03-28 5 views
6

Aktywny indeks nie aktualizuje się automatycznie. ReaD w kilku postach, które umieszczając tabView na formularzu, działa. Lub przez włączenie <p:ajax event="tabChange"/> w widoku tabla działa. Ale nic nie wydaje się działaćAktywny indeks tabview nie aktualizuje się automatycznie

xhtml

Próbka 1: automatyczne aktualizacje

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

Próbka 2: aktualizowanie na razie tabChange

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

Muszę zidentyfikować komórkę w zdarzeniu "onChange". Ale activeIndex ma zawsze wartość 0, wartość inicjalizowana. Zdarzenie nie dostaje połączenia.

fasola

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

fasola

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

Ale zdarzenie nie jest uzyskiwanie trigerred. Nie aktualizuje się automatycznie.

Jakie mogą być prawdopodobne problemy?

Dzięki, Shikha

Odpowiedz

5

następujące pracował dla mnie:

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

To wydaje się działać tylko wtedy, gdy [aktywny indeks nie jest powiązany z zarządzanym komponentem bean] (http://code.google.com/p/primefaces/issues/detail? id = 1640 & q = activeIndex & colspec = ID% 20Stars% 20Moduł% 20Type% 20Status% 20Priority% 20TargetVersion% 20Reporter% 20Owner% 20Podsumowanie). Jestem zaskoczony, że zespół Primefaces jeszcze go nie rozwiązał (pracuję z wersją 3.5). Działa to jednak, jeśli sam plik 'tabView' jest zawijany w formularz, zamiast mieć formularz dla każdej karty. –

+2

this.activeTabIndex = tv.getActiveIndex(); nie działa. Zamiast tego możesz użyć this.activeTabIndex = tv.getChildren(). IndexOf (event.getTab()); – ahmet

+0

zaczyna się od indeksu 0 lub 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. masz dodatkowy />
  2. natychmiastowe prawda może powodować problemy z p: ajax, należy użyć natychmiastowe prawdziwe, gdy nie masz walidacji lub ci Próbuję anulować operację.

    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> 
    

To działa, ale aktywny indeks 0.

+0

extra /> to literówka ... Próbowałem też bezzwłocznie. Nie działa. –

+0

Próbowałem już teraz twojego przykładu, ale activeIndex ma zawsze 0. być może jestem w błędzie, ale muszę spróbować. również będę edytować moją odpowiedź, powinieneś to sprawdzić. – utkusonmez

0

w xhtml, do której dzwonisz słuchacza = "# {promotionDetailBean. onTabChange}", ale w swojej fasoli nazwa metody jest „publiczne void tabChanged ". Więc nie może wywołać.

Próbowałem przykład w najlepszym-prezentacja na:

w fasoli (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); 
} 

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

Rezultatem jest zgodnie z oczekiwaniami: na początek kartę drugi jest wyświetlany. Klikam pierwszą kartę, a potem trzecią. sysout jest:

-------- 0

-------- 0

-------- 2

---- ---- 2

+0

Również ustawiający activeTabIndex, setActiveTabIndex(), jest wywoływana z poprawną wartością indeksu. – dasgin

+0

iw xhtml powinieneś umieścić tabView w h: formularz komponentu – dasgin

2

To tylko wydaje się działać, jeśli active index is not binded to the managed bean. Ale jest to dla mnie bezużyteczne, ponieważ chcę, aby zachowywać synchronizację widok fasoli widoku. Jestem zdumiony Primefaces zespół jeszcze tego nie rozwiązał (pracuję z wersją 3.5). Działa to jednak, jeśli sam plik p:tabView jest zawijany do postaci h:form zamiast jednego z nich dla każdej karty, ale powoduje to zmianę kontekstu przesyłania.

11

To działa na mnie, gdy karta nie jest zawarty wewnątrz formy, ale każda karta zawiera własny jedno:

  1. Dodaj słuchacza zmienić zakładka zdarzenia komponentu TabView:

    <p:ajax event="tabChange" listener="#{userBean.onTabChange}" />
  2. Uzyskanie aktywnego indeksu z podstawowego składnika TabView wydaje się nie działać. Jednak w przypadku, nowa wybrana karta jest poprawnie zaktualizowane, dzięki czemu możemy getthe indeks wyszukując w dzieciach składników TabView:

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

Mam nadzieję, że to działa dla Ciebie zbyt

0

ja łatwo naprawić to z:

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

w currentdata mam właściwość SP_Index z liczbą karcie (pierwszy, drugi ....)

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

i dodać skrypt jquery

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

Dla primefaces> = 5,0 należy użyć następującego kodu:

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

Wygląda na Androida :) – delive

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

Ten pracował dla mnie ...

+0

Czym różni się to od innych odpowiedzi? – Kukeltje