10

Active Index が自動的に更新されません。tabView をフォームに配置することで機能することをいくつかの投稿で読んでください。または<p:ajax event="tabChange"/>、タブビューに含めることで機能します。しかし、何も機能していないようです

xhtml

サンプル 1 : 自動更新

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

サンプル 2: 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>

「onChange」イベントでセルを識別する必要があります。ただし、activeIndex は常に 0 (初期化された値) です。イベントが呼び出されません。

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

しかし、イベントはトリガーされていません。自動的に更新されることもありません。

考えられる問題は何ですか?

ありがとう、シカ

4

8 に答える 8

13

これは、タブがフォーム内に含まれていないが、すべてのタブに独自のタブが含まれている場合に機能します。

  1. タブ変更イベントのリスナーを tabView コンポーネントに追加します。

    <p:ajax event="tabChange" listener="#{userBean.onTabChange}" />
  2. 基礎となる TabView コンポーネントからアクティブなインデックスを取得してもうまくいかないようです。ただし、イベントでは、新しく選択されたタブが正しく更新されるため、TabView の子コンポーネントを検索してインデックスを取得できます。

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

これがあなたにとってもうまくいくことを願っています

于 2013-05-31T10:47:55.480 に答える
6

以下は私のために働いた:

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>

豆:

public final void onTabChange(final TabChangeEvent event) {
    TabView tv = (TabView) event.getComponent();
    this.activeTabIndex = tv.getActiveIndex();
}
于 2012-04-12T09:35:28.497 に答える
2

これは、アクティブなインデックスがマネージド Bean にバインドされていない場合にのみ機能するようです。しかし、バッキング Bean-View 同期を維持したいので、これは役に立ちません。Primefacesチームがまだ解決していないことに驚いています (私は 3.5 バージョンで作業しています) 。ただし、タブごとに1つではなく、p:tabViewそれ自体がラップされている場合は機能しますが、これにより送信コンテキストが変更されます。h:form

于 2013-02-26T12:52:12.597 に答える
0

xhtml では listener="#{promotionDetailBean. onTabChange }" を呼び出していますが、Bean ではメソッド名は "public void tabChanged " です。したがって、トリガーすることはできません。

次の場所で、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);
}

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

結果は期待どおりです 。最初に 2 番目のタブが表示されます。最初のタブをクリックし、次に 3 番目のタブをクリックします。sysout は次のとおりです。

--------0

--------0

--------2

--------2

于 2012-03-29T13:01:20.633 に答える
0

私はこれを簡単に修正します:

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

現在のデータには、タブの数を持つプロパティSP_Indexがあります(最初、2番目....)

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

jqueryスクリプトを追加

<script>
    $("#tabView li:nth-child(#{currentData.SP_Index})").click();
</script>
于 2014-02-25T12:47:00.977 に答える
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. 余分な /> があります
  2. immediate true を使用すると、p:ajax で問題が発生する可能性があります。検証がない場合、または操作をキャンセルしようとしている場合は、immediate 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>
    

これは機能しますが、アクティブなインデックスは 0 です。

于 2012-03-29T06:13:12.397 に答える