0

背景と目的:

選択したタブに応じて同じページに表示されるコンテンツを切り替えるために、tabMenu を使用したいと思います。モデル バインディングをサポートしているため、tabMenu を選択しました。これにより、プログラム モデルを使用できるようになります。ナビゲーションに tabMenu を使用したくないし、現在のページが再度要求されることもありません。実装を複合コンポーネント (CC) に入れ、CC を再利用したり他のページに配置したりする場合に備えて、設計部分を柔軟にします。この CC のバッキング Bean は、メニュー モデルに追加される各 primefaces menuItem に追加される ActionListener インターフェースを実装します。オーバーライドされたメソッドの実装は、クリックされた menuItem に従って動的コンテンツを正しく表示するために、バックグラウンドでモデルを更新することになっています。CCを使用しようとしているページでは、さまざまなコンテンツを分離するためにprimefaces tabViewも使用しています。CCを使用したいタブでは、CCがそのタブの1つのコンテンツであるprimefaces accordionPanelも使用しています。

エラー状況と予想される動作:

複合コンポーネントをページの accordionPanel のタブの 1 つに配置すると、メニューのモデルがバッキング Bean に正しく組み込まれ、表示されます。1 つのメニュー項目をクリックしても、トリガーされたアクションにはなりません (Eclipse が processAction メソッドのブレークポイントで停止しないため、わかります)。サーバーログによると、例外はスローされません。

menuItem にはサーバー側のコールバックに使用できる actionListener 属性があるため、addActionListener() メソッドを使用して menuItem に追加する ActionListener が同じ機能を持つことを期待しています。

CC を外側の tabView の外に配置しようとしましたが、同じ結果になりました。

質問:

私がタブメニューでやろうとしていることを達成することは可能ですか? tabMenu 以外に代替手段はありますか? 望ましい動作を得るために何を変更する必要がありますか?

ページ定義:

 <p:tabView id="someTabViewId">
    <p:tab id="tabViewsFirstTab>
      <p:accordionPanel id="accordionPanelId" multiple="true" cache="false">
        <p:tab id="someTab1Id" title="someTab1Title">
... someTab1 content here ...
        </p:tab>

        <p:tab id="ccTab" title="ccTabTitle">
          <ccNameSpace:ccComponentName id="ccId" />
        </p:tab>

        <p:tab id="someTab2Id" title="someTab2Title">
... someTab2 content here ...
        </p:tab>
      </p:accordionPanel>
    </p:tab>
 </p:tabView>

CC の定義:

  <composite:interface>
  </composite:interface>
  <composite:implementation xmlns:anotherCCNameSpace="http://java.sun.com/jsf/composite/components/someEntity/someSpecialContent">
    <h:panelGrid style="width:100%;">
      <p:tabMenu id="test1" model="#{ccBean.tabMenuModel}" />
      <anotherCCNameSpace:specialComponent id="test" />
    </h:panelGrid>
  </composite:implementation>

ビーン定義:

@Named
@ViewScoped
public class CcBean implements ActionListener, SomeCustomInterface {

  private MenuModel menuModel;

...

  @Override
  public void processAction(ActionEvent event) throws AbortProcessingException {
    this.doSomePreparations(event);
  }

 @PostConstruct
  public void postConstruct() {
    this.menuModel = new DefaultMenuModel();
    for (SomeGroupEntity groupEntity : this.getAllSomeGroupEntities()) {
      MenuItem menuItem = new MenuItem();
      menuItem.setId("menuItem" + groupEntity.getId());
      menuItem.setUpdate("test1 test");
      menuItem.addActionListener(this);
      menuItem.setImmediate(true);
      menuItem.setValue(groupEntity.getName());
      this.menuModel.addMenuItem(menuItem);
    }
  }


  public MenuModel getTabMenuModel() {
    return this.menuModel;
  }

...
}
4

0 に答える 0