所以我对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>
答案 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(); }"
(如果你在数据表中选择数据当然)。这是第二次尝试对话显示的原因。
首先:运行时更新
oncomplete="if (#{referralTasksController.displayDeleteDialog}) { PF('confirmDailogWidget').show(); }"
将bean方法更改为
public void showDeleteDialog(){
if (selectedReferralTasks.size()!=0){
RequestContext.getCurrentInstance().execute("confirmDailogWidget.show()");
}
}
}
有关此解决方案的更多信息,请参阅PF documentation杂项&gt;请求上下文或Open from bean by RequestContext#execute()
第二:使用p:confirmDialog rendered
参数
删除oncomplete="if (#{referralTasksController.displayDeleteDialog}) { PF('confirmDailogWidget').show(); }"
将rendered
参数添加到p:confirmDialog
,例如<p:confirmDialog rendered="#{referralTasksController.displayDeleteDialog}"
。查看PF文档和p:confirmDialog
属性
点击按钮后更改update
参数更新confirmationDailogOutputPanel
,如<p:commandButton update="confirmationDailogOutputPanel"
。已与Ajax update/render does not work on a component which has rendered attribute