【问题标题】:primefaces command button not showing a confirm dialog until after the second clickprimefaces 命令按钮直到第二次单击后才显示确认对话框
【发布时间】:2016-12-12 08:04:02
【问题描述】:

所以我对 jsf 很陌生,我希望仅当我的支持 bean 中的属性设置为 true 时才显示确认对话框。我有这样的东西。

我有一个可以多选的数据表。当您选择表中的项目时,会在支持 bean 中设置一个属性来保存这些项目。

基本上,“showDeleteDialog()”方法的作用是检查列表中是否有任何项目被选中,如果删除按钮被选中,它才会显示确认对话框。

所以我想要发生的是,一旦有人从数据表中选择了项目,点击删除按钮。出现确认对话框,然后删除所选项目。如果用户没有从数据表中选择项目。我希望删除按钮不显示确认对话框。

            <p:commandButton
                styleClass="referralTaskDeleteBtn"
                id="deleteButton"
                value="#{loc['RegionAdmin.TaskType.DeleteButton']}"
                icon="ui-icon-close"
                update="deleteConfirmDialog,@this"
                rendered="true"
                action="#{referralTasksController.showDeleteDialog()}"
                oncomplete="if (#{referralTasksController.displayDeleteDialog}) { PF('confirmDailogWidget').show(); }"
                style="visibility: #{referralTasksController.toggleDeleteAndCompleteButtons()};"
                disabled="#{not referralTasksController.enableEditButtons()}"
        >
        </p:commandButton>

和后台bean方法

    public void showDeleteDialog(){
    if (selectedReferralTasks.size()!=0)
        this.displayDeleteDialog = true;

}

任何时候我点击它,我的对话框只会在第二次点击后打开。任何想法为什么?如果需要,我将包含该对话框。任何帮助将不胜感激。

<p:outputPanel id="confirmationDailogOutputPanel">
            <p:confirmDialog
                    id="deleteConfirmDialog"
                    header="Confirm Delete"
                    message="Are you sure you want to delete the selected Tasks"
                    showEffect="fade" hideEffect="fade"
                        widgetVar="confirmDailogWidget"
                    >

                <p:commandButton value="#{loc['RegionAdmin.TaskType.DeleteButton']}" styleClass="confirmDialogDeleteButton" icon="ui-icon-check"
                                 action="#{referralTasksController.deleteTasks()}"
                                 oncomplete="PF('confirmDailogWidget').hide();"
                                 update=":#{p:component('NoticePanel')},referralsTaskList,completeButton,deleteButton"
                />
                <p:commandButton value="#{loc['RegionAdmin.TaskType.CancelButton']}"
                                 styleClass="confirmDialogCancelButton"
                                 icon="ui-icon-close"
                                 oncomplete="PF('confirmDailogWidget').hide();"/>
            </p:confirmDialog>
        </p:outputPanel>

【问题讨论】:

  • 老实说,我不明白你的问题,我唯一的想法是尝试在你的条件下输出,看看他是否第一次进入
  • 对不起,我会尽量解释清楚

标签: jsf button primefaces command


【解决方案1】:

问题说明

在这oncomplete="if (#{referralTasksController.displayDeleteDialog}) { PF('confirmDailogWidget').show(); }" 部分代码中,您混合了 ExpressionLanguage (#{referralTasksController.displayDeleteDialog}) 和 JavaScript 代码(其他所有内容)。

因此,当您加载页面时,表达式语言会被评估(您可以设置断点来检查这一点)。在第一次加载页面时,当然评估返回 false。代码看起来像这样oncomplete="if (false) { PF('confirmDailogWidget').show(); }"。它永远不会调用show() 方法。

重新加载页面时(单击按钮后)再次评估表达式语言。现在代码看起来像这样oncomplete="if (true) { PF('confirmDailogWidget').show(); }"(当然,如果您在数据表中选择数据)。这就是为什么在第二次尝试时显示对话框的原因。

解决方案

第一:运行时更新

  1. 删除oncomplete="if (#{referralTasksController.displayDeleteDialog}) { PF('confirmDailogWidget').show(); }"
  2. 将bean方法改为

    public void showDeleteDialog(){
        if (selectedReferralTasks.size()!=0){
              RequestContext.getCurrentInstance().execute("confirmDailogWidget.show()");
        }
    }
    

    }

  3. 您可以在PF documentation Misc > Request Context 或Open from bean by RequestContext#execute()中找到有关此解决方案的更多信息

第二:使用p:confirmDialog rendered参数

  1. 删除oncomplete="if (#{referralTasksController.displayDeleteDialog}) { PF('confirmDailogWidget').show(); }"

  2. rendered 参数添加到p:confirmDialog 就像这样&lt;p:confirmDialog rendered="#{referralTasksController.displayDeleteDialog}"。查看 PF 文档和p:confirmDialog 属性列表

  3. 单击按钮后更改update 参数以更新confirmationDailogOutputPanel 像这样&lt;p:commandButton update="confirmationDailogOutputPanel"。已连接Ajax update/render does not work on a component which has rendered attribute

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 2013-01-01
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    相关资源
    最近更新 更多