9

次のような2つのタブを持つPrimefaces TabViewがあります。

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

タブを変更すると、サーバー上でactiveIndexが更新されず、常にデフォルト値が返されることを除いて、正常に動作します。私はプライムフェイス2.2.1を使用しています。

ありがとうございました。

4

3 に答える 3

14

PrimeFaces ShowCaseの例では、各タブに 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>

そのタブ ID は、tabChangeListener で取得できます。

public void onTabChange(TabChangeEvent event) {       
    System.out.println("tab id = " + event.getTab().getId());
}

次に、どのタブが選択されたかがわかります。


編集:

未解決の PrimeFaces問題 1640 TabView: Wrong activeIndex in TabChangeListenerがあります。発生している問題では常に 0 です。


編集2:

PrimeFaces 5.0以降でtabChangeListenerは、 は要素で使用できなくなりましたtabViewが、明示的な ajax タグを使用して tabChange イベントで使用する必要があります。

 <p:tabView id="analysisSections" value="#{analysisBean.analysis.sections}" var="section" activeIndex="#{analysisBean.activeIndex}">
      <p:ajax event="tabChange" listener="#{analysisBean.onTabChange}"/>

また、タブのインデックスを直接取得することもできます:

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

これらすべての変更により、activeIndex は適切に機能します。

于 2011-03-07T20:46:22.017 に答える
3

dynamic質問は PrimeFaces 2.2.1 に関連していましたが、最新の PrimeFaces バージョン (バージョン 6.2 でテスト済み) では、属性が に設定されtruecacheが に設定されている場合に別のイベントをトリガーする必要がないことに言及したいと思いますfalse。この属性の組み合わせを使用すると、別のタブが選択されたときにアクティブなインデックスがサーバー上で自動的に更新されます。

フェイスレット:

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

}
于 2018-09-23T16:23:56.920 に答える