Primefaces程序化tabMenu动作监听器

时间:2012-11-13 16:51:39

标签: jsf primefaces

背景和目的:

我想使用tabMenu根据所选标签切换同一页面上的某些显示内容。我选择了tabMenu,因为它支持模型绑定,因此我可以使用编程模型。我不想使用tabMenu进行导航,也不要再次请求当前页面。 我将我的实现放入一个复合组件(CC)中,以便在CC被重用或放在其他页面上时灵活设计部分。我的这个CC的支持bean实现了ActionListener接口,该接口被添加到添加到菜单模型的每个primefaces menuItem中。然后,被覆盖方法的实现应该在后台更新模型,以便根据点击的menuItem正确显示动态内容。 在页面上我试图使用我的CC我也使用primefaces tabView来分隔不同的内容。在我想要使用CC的选项卡中,我也使用了primefaces accordionPanel,其中我的CC是其中一个标签的内容。

错误情况和预期行为:

将我的复合组件放在我的页面上的一个accordionPanel选项卡中,菜单的模型正确地构建在我的支持bean中并显示。单击一个菜单项不会导致触发操作(我可以告诉,因为eclipse不会在我的processAction方法中的断点处停止)。根据服务器日志,不会抛出任何异常。

由于menuItem有一个可用于服务器端回调的actionListener属性,我希望我使用addActionListener()方法添加到menuItem的ActionListener具有相同的功能。

我还试图将我的CC置于外部tabView之外,结果相同。

问题:

是否有可能通过tabMenu来实现我打算做的事情?除了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>

Bean定义:

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

...
}

0 个答案:

没有答案