背景と目的:
選択したタブに応じて同じページに表示されるコンテンツを切り替えるために、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;
}
...
}