p:menuItem in p:menuBar在点击时不执行任何操作

时间:2016-05-05 23:40:42

标签: jsf primefaces

p:menuBar及其p:menuItem是在运行时生成的。它们正确渲染并且功能完美,但是当点击菜单中的任何选项时,没有任何反应。

我的index.xhtml非常简单。这只是p:tabView通过dataentry.xhtml合成我的ui:includedataentry.xhtml上的组件是发生问题的地方。

//dataentry.xhtml
<?xml version="1.0" encoding="UTF-8"?>
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:h="http://xmlns.jcp.org/jsf/html"
                xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
                xmlns:f="http://xmlns.jcp.org/jsf/core"
                xmlns:p="http://primefaces.org/ui">

    <h:form id="dataEntryForm">
        <p:menubar id="menuBar" binding="#{dataEntryBean.menuBar}" />
        <p:dashboard id="dashboard" binding="#{dataEntryBean.dashboard}"/>
    </h:form>

</ui:composition>

以下是生成p:menuBar的方法。同样,所有这些都在页面上正确呈现,当您点击某些内容时它不会做任何事情。

    private @NotNull Menubar spawnMenuBar() {
        final MenuModel MODEL = new DefaultMenuModel();
        {
            final DefaultSubMenu SM = new DefaultSubMenu("Create New...", "ui-icon-circle-plus");
            Arrays.stream(Type.values()).forEach(CT -> {
                final String CT_ALT = CT.toInitialCaps();
                final DefaultMenuItem DMI = new DefaultMenuItem(CT_ALT + " Card");
                DMI.setId("createNew" + CT_ALT + "Type");
                DMI.setParam("TYPE", CT.name());
                DMI.setTitle("Creates a new " + CT_ALT + " type panel in the dashboard.");
                DMI.setCommand("#{dataEntryBean.addNewTypePanel(param.get('TYPE'))}");
                SM.addElement(DMI);
            });
            MODEL.addElement(SM);
        }
        {
            final DefaultSubMenu SM = new DefaultSubMenu("Global Actions...", "ui-icon-alert");
            // Implementation removed for brevity's sake...
            MODEL.addElement(SM);
        }
        final Menubar MENU = new Menubar();
        MENU.setModel(MODEL);
        return MENU;
    }

...最后,这是第一个p:menuItem中所有p:subMenu s应该调用的方法。

public void addNewTypePanel(final String TYPE) {
    System.out.println("Method Call: addNewTypePanel(" + TYPE + ")");
    // Implementation removed for brevity's sake...
}

println()中的addNewTypePanel()永远不会出现。

奇怪(并且,我怀疑,无关),此bean的构造函数的第一行上的println()出现两次(然后第三次加载p:tabView中的相应选项卡时)。

任何想法?
doHope(HopeSeverity.VERY_HARD);

<小时/> 编辑#1:根据Kukeltje的建议,我通过完全评论p:tabView并从h:form复制dataentry.xhmtl来重新测试此代码(请参阅下面的代码块)。不幸的是,问题(问题?)是一样的。仍然没有响应click,仍然看到bean的构造函数被调用三次。

// index.xhtml (alt version, same behavior)
    <f:view>
       <h:body>
           <h3>Some Text</h3>
           <h:form id="dataEntryForm">
               <p:menubar id="menuBar" binding="#{dataEntryBean.menuBar}" />
               <p:dashboard id="dashboard" binding="#{dataEntryBean.dashboard}"/>
           </h:form>
       </h:body>
   </f:view>

为了澄清,bean是@SessionScoped@ManagedBean。我正在使用MyFaces 2.2.10在Tomcat 8.0.33上测试所有这些。

<小时/> 编辑#2:根据Kukeltje的要求,删除了一些似乎与问题无关的信息。

0 个答案:

没有答案