0

静的メニュー ファイル (header.xhtml) をモデル付きのメガ メニューに変更しました。このような:

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

          </p:megaMenu>

これまでのところ、うまく機能し、期待どおりに構築されています。問題は、私のフォーム ページで、検証が 2 回目に失敗したときです...次のエラーが発生します。

 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">

この:

だから...私は本当に理解していません。私のMenuControllerはsessionBeanです:

@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を使用しています)。したがって、考えられる解決策の 1 つは、JSF インプを My Faces に変更することです。私はそれを試しましたが、私の構造にバグがありました (複合コンポーネントが機能しなくなり、dynaForm も機能しなくなりました)。

いくつかの回避策を試しましたが、成功しませんでした。これは私が試したものです: Overriding AbstractMenu and Marlon Patrick's solution (PT-BR)

単に機能しません =[

編集-> MenuItem の作成

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

1 に答える 1

2

私が見たところによると、あなたはすでに私の 2 つの回避策を試しました: AbstractMenu を上書きし、PhaseListener を配置します。

さて、私が認識しているのは、私がMenuBarを持っていた問題であり、あなたが使用しようとしているのはMegaMenuであるということです.MegaMenuではうまくいかない解決策かもしれません.

私があなたに言いたいのは、次のことを確認することです。

1 - クラス AbstractMenu をオーバーライドすると、PrimeFaces がそれを使用し始めたと確信できますか? そこにブレークポイントを配置することを確認し、実行フローを確認します。PrimeFaces はまだ独自のクラスを使用しているため、停止しない場合。

2 - 私が好み、現在使用している PhaseListener でソリューションを使用しようとすると、コードの一部を独自のコードに置き換える必要があることに気付きましたか? 基本的に、リンクであるメニュー項目のアクションのみを削除する必要があります。これは、この問題を引き起こしているためです。メニュー項目は残すべきアクションです。私の場合、ID によってアクションまたはリンクが何であるかを知っていたので、ID によってもそれを信じて区別する必要があります。また、PhaseListener が適切に登録され、実行フローをインターセプトしていることを確認するために、ブレーク ポイントを配置します。

于 2013-02-13T18:04:25.997 に答える