primefaces命令按钮直到第二次单击后才显示确认对话框



所以我对jsf还很陌生,我希望只有在我的backingbean中将属性设置为true时才显示确认对话框。我有这样的东西。

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

基本上,"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>

和支持豆方法

    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>

问题说明

在代码的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文档Misc>RequestContext或RequestContext#execute((从bean打开

第二:使用p:confirmDialog rendered参数

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

  2. <p:confirmDialog rendered="#{referralTasksController.displayDeleteDialog}"一样,将rendered参数添加到p:confirmDialog中。查看PF文档和p:confirmDialog属性列表

  3. 点击按钮后更改update参数以更新confirmationDailogOutputPanel,如<p:commandButton update="confirmationDailogOutputPanel"。与Ajax连接的更新/渲染在具有渲染属性的组件上不起作用

相关内容

  • 没有找到相关文章

最新更新