是否可以通过Primefaces 3.3的自定义对话框取消Ajax请求

Is it possible to cancel Ajax-Requests with a custom dialog with Primefaces 3.3?

本文关键字:取消 Ajax 请求 对话框 可以通过 Primefaces 是否 自定义      更新时间:2023-09-26

如果用户更改selectOneMenu中的值,我们希望显示一个确认对话框。这与浏览器本机confirm()方法配合得很好,因为它会阻塞直到用户决定。有没有一个优雅的(首选的客户端)解决方案可以通过素数面对话框来实现这一点,从而使不同浏览器的外观保持一致?

当前解决方案:

<p:selectOneMenu id="som" value="#{foo.item}">
    <f:selectItems value="#{foo.items}" var="i" itemLabel="#{i.name}" itemValue="#{i.value}" />
    <p:ajax event="change" onstart="return confirmChange()" />
</p:selectOneMenu>
<script type="text/javascript">
    function confirmChange() {
        return confirm("O'RLY?");
    }
</script>

您可以使用PrimeFaces的<p:confirmDialog>,甚至只使用<p:dialog>

<p:selectOneMenu id="som" value="#{foo.item}" onchange="confirm.show()">
    <f:selectItems value="#{foo.items}" var="i" itemLabel="#{i.name}" itemValue="#{i.value}" />
</p:selectOneMenu>
<p:confirmDialog widgetVar="confirm" message="ORLY?" header="Confirm" severity="alert">
    <p:commandButton value="Yes" action="#{bean.submit}" process="som" oncomplete="confirm.hide()" />  
    <p:commandButton value="No" type="button" onclick="confirm.hide()" />
</p:confirmDialog> 

#{bean.submit}中执行确认作业。如果需要的话,你可以用一个标记文件或一个复合组件来抽象这一切,这样它就可以更好地重用了。

<p:selectOneMenu id="som" value="#{foo.item}" onchange="confirm.show()">
    <f:selectItems value="#{foo.items}" var="i" itemLabel="#{i.name}" itemValue="#{i.value}" />
</p:selectOneMenu>
<my:confirmDialog id="confirm" message="ORLY?" action="#{bean.submit}" process="som" />

请注意,这里没有"取消"ajax请求的方法。你只是在真正确认之前不会调用它。