【问题标题】:Primefaces - Customize p:confirmDialog content conditionallyPrimefaces - 有条件地自定义 p:confirmDialog 内容
【发布时间】:2021-08-08 00:37:06
【问题描述】:

我有一个对象列表(我们称每个对象为 record 对象),通过<p:datatable> 组件显示。每条记录都有一个删除按钮列

当用户点击记录的删除按钮时,会显示<p:confirmDialog>,要求用户确认。我想要的是在相应情况下自定义confirmDialog的内容(例如显示/不显示有关记录属性值的复选框,f.e if record.isPersonal, show the checkbox, else not

不幸的是,这似乎不起作用复选框总是显示,以防第一条记录满足条件,反之则不然。经过一番研究,我发现尤其是在以前的 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>

提前致谢!

【问题讨论】:

  • 你不想global="false" 这样它就不会为应用程序存储 1 个确认对话框的副本。您需要以某种方式将您的确认对话框设置为update=,以便在调用时重新评估其内容。不确定我是否通过确认对话框看到了这一点。
  • @Melloware 谢谢你的回复,确实我把global=“true”改成global=“false”了,你有什么建议让我相应地更新confirmDialog的内容吗?跨度>
  • 我不确定它是否可能。我从来没有使用过 ConfirmDialog 你是如何使用它的。
  • 好吧,我什至尝试创建两个单独的outputPanels,其中分别包含commandButtonconfirmDialog,并根据此条件渲染它们,但在任何情况下仍然只触发第一个confirmDialog ,这已经让我发疯了

标签: jsf primefaces primefaces-datatable


【解决方案1】:

我认为与其使用 ConfirmDialog,不如使用 p:dialog 或使用 对话框框架,您可能不得不恢复构建自己的自定义对话框。使用对话框框架,您可以创建一个简单的确认对话框,并可以以编程方式将数据传递到对话框中 - 例如基于当前行的标志,指示是否应显示复选框。对话框框架还提供了一种使用dialogReturn ajax 事件将数据从对话框返回到调用页面的简单方法。

【讨论】:

  • 感谢您的回复,您认为使用p:dialog 组件的正确方法是什么,以便每次单击数据表中的删除按钮时,都会将记录对象传递给@ 987654327@?我想我可以通过附加到删除按钮的 ajax onclick 事件来更新组件,但这与我在 cmets 中已经提到的解决方案一样复杂,您能否发布您建议的代码示例?
  • 要使用p:dialog 并查看将数据传递到对话框的示例,请参阅PrimeFaces Showcase --> DataTable --> Selection (first example)。请注意(与示例不同)对话框应该在主窗体之外,并且应该包含它自己的窗体。
  • 这似乎很适合我的情况,将尝试实施它并让您知道,谢谢:)
  • 我实现了该解决方案并且工作正常,但是,我将对话框添加到与数据表相同的表单内并且工作正常,您为什么建议对话框应该在主表单之外?
  • 一般来说,一个表单应该代表一个逻辑工作单元。请参阅 BalusC 的回复 here。但我也发现了这个PF discussion,特别是当对话框本身具有 Ajax 操作时。所以一种形式是可以的,但并不总是最佳的,我认为,但是使用 ajax(正如 PF 默认所做的那样)有助于限制使用一种大型形式的影响。
【解决方案2】:

您可以使用&lt;p:confirmDialog message=""/&gt; 有条件地显示不同的消息,如下所示:

<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>

如果您想容纳更多内容,可以使用&lt;f:facet name="message"&gt;...&lt;/f:facet/&gt;

另请参阅:

<p:confirmDialog> with a parameter message

【讨论】:

  • 您好,感谢您的回复,不幸的是,这个答案似乎没有回答我的问题,我不想在条件下有自定义消息,而是在确认对话框中自定义内容,涉及 触发该调用的标记,为了做到这一点,我在删除按钮上附加了一个 ajax onclick 事件,该事件“更新”confirmDialog 的内容,它有效,但我不认为它是最佳解决方案
猜你喜欢
  • 1970-01-01
  • 2014-12-15
  • 2014-04-27
  • 2021-05-29
  • 1970-01-01
  • 2013-04-22
  • 1970-01-01
  • 1970-01-01
  • 2014-02-25
相关资源
最近更新 更多