0

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

我在 p:dataTable 的 p:column 中有 p:commandButton。当使用如下所示的 xhtml 单击按钮时,我可以显示覆盖菜单。

    <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 打开覆盖菜单?

提前致谢。

4

1 回答 1

0

我找不到这个问题的解决方案,但我得出的结论是,我想要做的对于我正在处理的环境来说不是一个好主意。

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

其次,我注意到将菜单放在 DataTable 中(在我的情况下位于 TabView 下)会导致非常奇怪的问题。当我更新 DataTable 时,一些 ajax 相关功能停止工作。我无法解释这个问题让你理解或相信,但我正在开发的应用程序有这个问题。

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

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

于 2012-06-21T04:20:07.683 回答