0

背景和目的:

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

错误情况和预期行为:

将我的复合组件放在我的页面上的手风琴面板选项卡之一中,菜单模型正确构建在我的支持 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>

豆定义:

@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