如何使用Primefaces从p:commandButton的oncomplete中打开叠加菜单?

时间:2012-06-19 06:47:35

标签: primefaces

我正在使用Primefaces 3.3.1并且有疑问。

我在p:dataTable的p:列中有p:commandButton。单击按钮时,我可以显示叠加菜单,如下所示。

    <p:commandButton id="btnID" icon="ui-icon-circle-triangle-s" style="height: 16px;">
        <f:setPropertyActionListener value="#{searchItem}" target="#{bean.selectedSearchItem}" />
    </p:commandButton>
    <p:slideMenu overlay="true" trigger="btnID" my="left top" at="left bottom"
            model="#{bean.menuModel}"/>

在这种情况下,bean.menuModel可以立即返回菜单数据。但我还有另一个案例,需要预先检测才能使菜单数据准备就绪。所以我也有这个。

    <p:commandButton ajax="true" id="historyButton" action="#{bean.getHistory()}"
        icon="ui-icon-note" style="height: 16px;"
        onstart="workingDialog.show();"
        oncomplete="workingDialog.hide(); historyMenu.show();"> 
        <f:setPropertyActionListener value="#{searchItem}" target="#{bean.selectedSearchItem}" />
    </p:commandButton>
    <p:menu overlay="true" widgetVar="historyMenu" my="left top" at="left bottom"
            model="#{searchBean.menuModel}"/> 

我的意思是,当单击按钮时,它会调用bean.getHistory(),它会开始加载该行的菜单数据,并显示带有圆圈图标的模态对话框。加载完成后,对话框将消失,并显示叠加菜单。我不能做的是这个场景的最后一部分。上面的代码触发异常。

java.lang.NullPointerException
    javax.faces.component.UIComponentBase.findComponent(UIComponentBase.java:561)
    org.primefaces.component.menu.BaseMenuRenderer.encodeOverlayConfig(BaseMenuRenderer.java:138)
    org.primefaces.component.menu.MenuRenderer.encodeScript(MenuRenderer.java:45)
    org.primefaces.component.menu.BaseMenuRenderer.encodeEnd(BaseMenuRenderer.java:39)
    javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1763)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1759)

下面显示的代码工作正常,没有与菜单相关的代码。

    <p:commandButton ajax="true" id="historyButton" action="#{searchBean.getHistory()}"
        icon="ui-icon-note" style="height: 16px;"
        onstart="workingDialog.show();"
        oncomplete="workingDialog.hide();"> 
        <f:setPropertyActionListener value="#{searchItem}" target="#{bean.selectedSearchItem}" />
    </p:commandButton>

我想这对专家来说很容易。如何从oncomplete中打开叠加菜单?

提前致谢。

1 个答案:

答案 0 :(得分:0)

我找不到解决这个问题的方法,但我得出结论,我想做的事情对我正在研究的环境并不是一个好主意。

首先,我注意到菜单在填充数据行时从bean获取数据,而不是在显示菜单时。并且菜单没有延迟加载机制。按钮点击 - &gt;从服务器获取菜单数据 - &gt;打开菜单不能像我预期的那样完成(至少在我看来)。

其次,我注意到在DataTable中放置菜单(在我的情况下在TabView下)会导致非常奇怪的问题。当我更新DataTable时,一些与ajax相关的函数停止工作。我无法解释这个问题让你理解或相信,但我正在研究的应用程序是遇到这个问题。

所以,我在我的应用程序中放弃了DataTable中的菜单。谢谢你的关注。

我接受这个答案不是为了降低我已经低的接受率。