Jsf Primefaces-有条件地自定义p:confirmDialog内容
我有一个对象列表(让我们把每个对象称为记录对象),通过Jsf Primefaces-有条件地自定义p:confirmDialog内容,jsf,primefaces,primefaces-datatable,Jsf,Primefaces,Primefaces Datatable,我有一个对象列表(让我们把每个对象称为记录对象),通过组件显示。每条记录都有一个删除按钮列 当用户单击记录的删除按钮时,会显示,要求用户确认。我想要的是在相应的情况下自定义confirmDialog的内容(例如,显示/不显示有关记录属性值的复选框,f.eif record.isPersonal,则显示复选框,否则不显示) 不幸的是,这似乎不起作用,因为如果第一条记录满足条件,复选框总是显示,如果不满足条件,复选框就会显示。经过一些研究,我发现,特别是在以前的Primefaces版本中,他们使用的
组件显示。每条记录都有一个删除按钮列
当用户单击记录的删除按钮时,会显示
,要求用户确认。我想要的是在相应的情况下自定义confirmDialog的内容(例如,显示/不显示有关记录属性值的复选框,f.eif record.isPersonal,则显示复选框,否则不显示
)
不幸的是,这似乎不起作用,因为如果第一条记录满足条件,复选框总是显示,如果不满足条件,复选框就会显示。经过一些研究,我发现,特别是在以前的Primefaces版本中,他们使用的是“JS方式”(创建两个单独的确认对话框,并按比例使用PF('widgeName').show()
,但我想知道通过标记或其他方式使用的Primefaces 7.0版本中是否存在现成的解决方案。下面的代码示例:
<p:dataTable id="recordsTable" lazy="true" value="#{myBean.myList.records}" var="record...">
<p:column styleClass="deleteColumn">
<p:commandButton ...>
<p:confirm .../>
</p:commandButton>
<p:confirmDialog widgetVar="delete_record_dialog" global="true" showEffect="fade" hideEffect="fade">
<p:selectBooleanCheckbox
rendered="#{record.isPersonal}"
....>
</p:selectBooleanCheckbox>
<p:commandButton value="#{msg.yes}" type="button"
styleClass="ui-confirmdialog-yes" icon="pi pi-check"
/>
<p:commandButton value="#{msg.no}" type="button" styleClass="ui-confirmdialog-no"
icon="pi pi-times"
/>
</p:confirmDialog>
</p:column>
</p:dataTable>
提前感谢!您可以使用
有条件地显示不同的消息,如下所示:
<p:confirmDialog widgetVar="delete_record_dialog"
header="Record delete"
message="Are you sure you want to delete #{record.isPersonal ? 'your personal' : 'this'} record?">
<h:form id="recordDeleteForm">
<p:commandButton value="#{msg.yes}" update=":tableForm"
oncomplete="PF('deleteDialog').hide(); PF('recordsTableWidgetVar').filter()"/>
<p:commandButton value="#{msg.no}" type="button"
onclick="PF('delete_record_dialog').hide()"/>
</h:form>
</p:confirmDialog>
如果您想加入更多内容,可以使用…
另请参见:
我认为,与使用ConfirmDialog相比,您可能需要恢复到使用
p:dialog
或使用对话框框架来构建自己的自定义对话框。使用dialog框架,您可以创建一个简单的确认对话框,并可以通过编程方式将数据传递到对话框中,例如,基于当前ro的标志w指示是否应显示复选框。对话框框架还提供了一种使用dialogReturn
ajax事件将数据从对话框返回调用页的简便方法。是否希望global=“false”
这样它就不会存储应用程序的确认对话框的一个副本。您需要将确认对话框设置为update=
,以便在调用时重新评估其内容。不确定我是否看到确认对话框完成了此操作。@Melloware感谢您的回复,事实上我已将其从global=“true”更改为global=“false”,您有什么建议让我相应地更新confirmDialog的内容吗?我不确定这是否可能。我从未使用过confirmDialog,您是如何使用它的。我甚至尝试用commandButton
和confirmDialog
分别创建两个独立的OutputPanel
,并根据根据这种情况,但在任何情况下,仍然只有第一个confirmDialog
被触发,这已经开始让我发疯了。谢谢你的回复,不幸的是,这个答案似乎并没有回答我的问题,我不想在这种情况下有一条定制的消息,而是想在confirmDialog中定制关于ag触发了该调用,为了实现这一点,我在delete按钮上附加了一个ajax onclick事件,它“更新”confirmDialog的内容有效,但我不认为它是最佳解决方案感谢您的回复,您认为使用p:dialog
组件的正确方式是什么,以便每次单击datatable中的delete按钮时,记录对象都会传递到p:dialog
?我想我可以更新组件通过附加到delete按钮的ajax onclick事件进行nt,但这将是一个与我在评论中提到的解决方案一样复杂的解决方案,请发布您的建议的代码示例。要使用p:dialog
并查看将数据传递到对话框的示例,请参见。注意(与示例中不同)对话框应该在主窗体之外,并且应该包含它自己的窗体。这似乎非常适合我的情况,我将尝试实现它并让您知道,谢谢:)我实现了这个解决方案,对我来说效果很好,但是,我在与datatable相同的表单中添加了对话框,效果很好,为什么您会建议对话框应该在主表单之外?通常,表单应该表示一个逻辑工作单元。请参阅BalusC的回答。但是我也发现了这一点,特别是在对话框它本身有Ajax操作,所以一个表单是可以的,但我认为并不总是最优的,但是使用Ajax(就像PF默认使用的那样)有助于限制使用一个大表单的影响。