所以我对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(); }"
(当然,如果您选择数据表中的数据(。这就是第二次尝试时显示对话框的原因。
解决方案
第一:运行时更新
- 删除
oncomplete="if (#{referralTasksController.displayDeleteDialog}) { PF('confirmDailogWidget').show(); }"
-
将bean方法更改为
public void showDeleteDialog(){ if (selectedReferralTasks.size()!=0){ RequestContext.getCurrentInstance().execute("confirmDailogWidget.show()"); } }
}
-
有关此解决方案的更多信息,您可以在PF文档Misc>RequestContext或RequestContext#execute((从bean打开
第二:使用p:confirmDialog rendered
参数
-
删除
oncomplete="if (#{referralTasksController.displayDeleteDialog}) { PF('confirmDailogWidget').show(); }"
-
像
<p:confirmDialog rendered="#{referralTasksController.displayDeleteDialog}"
一样,将rendered
参数添加到p:confirmDialog
中。查看PF文档和p:confirmDialog
属性列表 -
点击按钮后更改
update
参数以更新confirmationDailogOutputPanel
,如<p:commandButton update="confirmationDailogOutputPanel"
。与Ajax连接的更新/渲染在具有渲染属性的组件上不起作用