【问题标题】:Process primefaces menu before show显示前处理 primefaces 菜单
【发布时间】:2015-10-15 10:02:54
【问题描述】:

我有一个 primefaces 菜单,其中项目在支持 bean 的条件下被禁用。 问题是,条件是在更新后处理的。

如果我选择一个启用所有项目的节点并切换到一个禁用所有项目的节点, 菜单会重新加载,但会在项目被禁用之前显示所有启用的内容。

有没有办法在菜单显示之前处理禁用条件?

<h:form id="form">
    <p:tree id="tree" ...>
        <p:ajax event="select" update=":form:tree:menu" listener...>
        <p:treeNode id="treenode">
            <p:commandButton id="btn" type="button" />
            <p:overlayPanel for="btn">
                <p:menu id=menu">
                    <p:menuitem .... disabled="#{bean.condition1}" />
                    <p:menuitem .... disabled="#{bean.condition2}" />
                    ...
                </p:menu>
        </p:overlayPanel>
    </p:treenode>
</p:tree>

【问题讨论】:

  • type="button" 使它成为一个死客户端按钮,而不是一个通过 ajax 魔法与服务器交互的提交按钮。也许你没有意识到这一点?
  • @BalusC 你是对的,我从按钮中删除了 ajax 的东西。在 Primefaces Showcase 之后,对于 overlayPanel-magic,type=button 是必需的。据我了解,更新是由选择事件触发的,而不是按钮。顺便说一句:使用 type=submit 的按钮并没有解决问题。

标签: jsf jsf-2 primefaces


【解决方案1】:

已编辑

在 ajax 调用开始时隐藏菜单项,并在调用完成时显示它们。页面中的源代码为:

<p:tree id="tree" value="#{bean.root}" var="node" selectionMode="checkbox">
    <p:treeNode id="treenode">
        <p:commandButton id="btn" value="#{node}"
                 onstart="$('.ui-overlaypanel-content').css('display','none');" 
                 oncomplete="$('.ui-overlaypanel-content').css('display','block');"
                 actionListener="#{bean.processAndUpdateConditions}" update="mymenu"/>
        <p:overlayPanel for="btn">
            <p:menu id="mymenu" >
                <p:menuitem  value="Condition 1" disabled="#{bean.condition1}" />
                <p:menuitem value="Condition 2" disabled="#{bean.condition2}" />
            </p:menu>
        </p:overlayPanel>
    </p:treeNode>
</p:tree>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多