primefaces命令按钮在第二次单击

时间:2016-08-05 20:13:13

标签: jsf button primefaces command

所以我对jsf很新,我希望只有在我的支持bean中将属性设置为true时才会显示确认对话框。我有类似的东西。

我有一个可多选的数据表。当您在表中选择项目时,在辅助bean中设置属性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>

和支持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>

1 个答案:

答案 0 :(得分:0)

问题解释

在此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杂项&gt;请求上下文或Open from bean by RequestContext#execute()

  4. 第二:使用p:confirmDialog rendered参数

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

    2. rendered参数添加到p:confirmDialog,例如<p:confirmDialog rendered="#{referralTasksController.displayDeleteDialog}"。查看PF文档和p:confirmDialog属性

    3. 列表
    4. 点击按钮后更改update参数更新confirmationDailogOutputPanel,如<p:commandButton update="confirmationDailogOutputPanel"。已与Ajax update/render does not work on a component which has rendered attribute

    5. 相关联