Primefaces动态超级菜单-不能删除同一个组件两次



我用带有模型的超级菜单更改了静态菜单文件(header.xhtml)。像这样:

          <p:megaMenu model="#{menuController.megaModel}" autoDisplay="false" styleClass="menu-bar"  >
          </p:megaMenu>

到目前为止,一切都很好,它运行得很好,就像我预期的那样。问题是,在我的表单页面上,当验证第二次失败时。。。我得到这个错误:

 javax.faces.FacesException: Cannot remove the same component twice: j_idt15:j_id2     com.sun.faces.context.StateContext$AddRemoveListener.handleAddRemoveWithAutoPrune(StateContext.java:493)
        com.sun.faces.context.StateContext$AddRemoveListener.handleRemove(StateContext.java:372)

查看生成的HTML,我找不到这个字符串"j_idt15:j_id2",但我可以找到:

   <div id="j_idt14:j_idt15" class="ui-menu ui-menubar ui-megamenu ui-widget ui-widget-content ui-corner-all ui-helper-clearfix menu-bar" role="menubar">

并且这个:

所以。。。我真的不明白。我的菜单控制器是一个会话Bean:

@Component
@Scope("session")
public class MenuController implements Serializable {
@PostConstruct
   public void init(){
   todosModulos = moduloService.findAll();
   modulosAcesso = extrairModulos();
   createMegaMenu();
}

所以…一些注意事项:

我发现这个错误发生在2.1.9以上版本的Mojarra上。(我使用的是2.1.10)。因此,一个可能的解决方案是将JSF imp更改为My Faces。我试过了,但它扰乱了我的结构(我的复合组件停止了工作,dynaForm也停止了)。

我尝试了一些变通办法,但没有成功。这是我尝试过的:重写AbstractMenu和Marlon Patrick的解决方案(PT-BR)。

根本不起作用=[

编辑->创建菜单项

 MenuItem anItem = new MenuItem();
 anItem.setOutcome(item.getOutcome());
 anItem.setValue(item.getRotulo());
 anItem.setIcon(item.getIcone());       

据我所见,您已经尝试了我的两种解决方案:覆盖AbstractMenu和放置PhaseListener。

好吧,我意识到,我的MenuBar和你试图使用的问题所在的组件是MegaMenu,也许是我不适用于MegaMenu的解决方案,尽管我相信这应该是可行的。

我想对你说的是检查以下内容:

1-当你覆盖类AbstractMenu时,你确定PrimeFaces开始使用它了吗?为了确保它在那里设置了一个断点,以及他是否看到了执行流程。如果不停止,因为PrimeFaces仍在使用自己的类。

2-在尝试使用PhaseListener解决方案时,我今天更喜欢使用它,您注意到您需要用自己的代码替换一段代码?基本上,你只需要删除作为链接的菜单项的操作,因为它们会导致这个问题。菜单项是应该保留的操作。在我的情况下,我通过ID知道什么是操作或链接,然后你必须通过ID来区分。此外,设置一个断点,以确保你的PhaseListener已正式注册,这就是拦截执行流。

相关内容

  • 没有找到相关文章

最新更新