【问题标题】:How to conditionally show p:dialog based on backing bean condition如何根据支持 bean 条件有条件地显示 p:dialog
【发布时间】:2014-08-14 14:23:34
【问题描述】:

有没有办法(或正确的方式)有条件地根据支持 bean 条件在 primefaces 上显示对话框? 代码如下所示:

<!-- dialog declaration -->
<p:dialog id="dialogTest" widgetVar="dialogTest" header="#{text['modal.header']}" modal="true" >
                <h:outputText value="Test output" />
            </p:dialog>
<!-- caller -->
<p:menuitem value="Check" actionListener="#{backingBean.performCheck}" oncomplete="PF('dialogTest').show()" icon="ui-icon-arrowthick-1-e"/>                            

我的支持 bean 如下所示:

private boolean conditionFlag; // ... +getter

public void performCheck() {
    // ... access managers (database)
    this.conditionFlag = dao.check();// some check;
}

我只想显示对话框,以防conditionFlagtrue。在performCheck 运行后,我该如何在p:menuitem 上执行此类操作?

oncomplete="if (#{backingBean.conditionFlag}) { PF('dialogTest').show() }"
  • JSF 2.0
  • Primefaces 5
  • Java 1.7

【问题讨论】:

    标签: jsf primefaces modal-dialog


    【解决方案1】:

    我让这个工作如下

    <!-- dialog declaration -->
    <h:form id="dialogForm">
       <p:dialog id="dialogTest" 
                 widgetVar="dialogTest" 
                 header="#{text['modal.header']}" 
                 modal="true">
                   <h:outputText value="Test output" />
       </p:dialog>
    </h:form>
    <!-- caller -->
    <p:menuitem value="Check" 
                actionListener="#{backingBean.performCheck}" 
                oncomplete="if (#{backingBean.conditionFlag}) { PF('dialogTest').show() }"
                icon="ui-icon-arrowthick-1-e" 
                update="@this, :dialogForm, :dialogForm:dialogTest"/> 
    

    backing bean 保持不变(如问题所示)。

    主要区别在于oncomplete属性和ajaxupdate属性()

    【讨论】:

    • 菜单项是否使用此更新命令重新渲染?如果没有,请原谅我,但我无法弄清楚它是如何工作的。 :)
    • 菜单项未更新 - 菜单项独立于 dialogForm。但是,如果表单包含菜单项(注意 id 和命名容器),我认为这不会造成任何伤害
    • 那么当ajax请求完成时if (#{backingBean.conditionFlag})部分是如何更新的呢?
    • 我认为诀窍是oncomplete 属性:如果使用onclick,则不能保证if (#{backingBean.conditionFlag}) 执行之后 actionListener 执行
    • 我相信 menuitem 必须确实更新。因为是的,oncomplete 在动作监听器之后起作用,但这还不够。如果您不更新 menuitem,则该 if 子句在初始页面加载后将保持不变。
    【解决方案2】:

    只需将update="@this" 添加到p:menuitem。那么您的 oncomplete 块将按照您的预期工作。

    【讨论】:

    • 我错过了更新,但不是 @this,我提供了自己的答案来完成你的
    【解决方案3】:

    只需将布尔变量绑定到对话框的visible 属性即可。

    <p:dialog id="dialogTest" visible="#{backingBean.conditionFlag}" widgetVar="dialogTest" header="#{text['modal.header']}" modal="true" >
        <h:outputText value="Test output" />
    </p:dialog>
    

    然后让菜单项正常执行:

    <p:menuitem value="Check" actionListener="#{backingBean.performCheck}" oncomplete="PF('dialogTest').show()" icon="ui-icon-arrowthick-1-e" update="dialogTest"/>
    

    不需要额外的工作。为获得最佳效果,请使用 @ViewScoped bean。

    【讨论】:

    • 如果它可以工作非常好,但它不需要重新加载整个页面吗? stackoverflow.com/questions/10050669/…
    • @JaqenH'ghar- 不,它不会,但很好 - 我忘了添加 ajax 更新对话框的位
    • 我得到了渲染属性和可见属性之间的区别 - 我觉得根本不渲染更正确,因为在我的情况下,对话框每次都会显示不同的(服务器端起源的)数据已显示,所以我选择呈现的替代方案
    • @kolossus 我得到了它的工作 - 我注意到 ajax 更新丢失了,就是这样,将提供我自己的答案 - 我可以认为这是正确的答案(因为更新丢失了,我注意到它在阅读您的 cmets 时),但答案的基本原理不符合不起作用的条件。所以我只会 +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2019-11-13
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多