【问题标题】:Is it possible to cancel Ajax-Requests with a custom dialog with Primefaces 3.3?是否可以使用 Primefaces 3.3 的自定义对话框取消 Ajax 请求?
【发布时间】:2012-08-16 22:23:16
【问题描述】:

如果用户更改selectOneMenu 中的值,我们希望显示一个确认对话框。这对浏览器原生的confirm() 方法非常有效,因为它会阻塞直到用户做出决定。是否有一个优雅的(首选客户端)解决方案可以使用 primefaces 对话框执行此操作,以便不同浏览器的外观保持一致?

目前的解决方案:

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

【问题讨论】:

    标签: javascript jquery jsf-2 primefaces


    【解决方案1】:

    您可以使用 PrimeFaces 的 &lt;p:confirmDialog&gt; 甚至只是 &lt;p:dialog&gt;

    <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 请求的方法。只是在真正确认之前不要调用它。

    【讨论】:

    • 看起来不错!但是从 onstart 返回 false 真的不是取消 ajax 请求吗?我会参考这篇文章:cagataycivici.wordpress.com/2010/08/12/… 目前,当值更改时会自动调用 setter,这可能会被取消。因此,在您的解决方案中,我将始终调用 setter,但仅接受来自对话框的值。有道理,但感觉必须更容易! :)
    • 是的,但是您想要一个自定义的 HTML 确认对话框,而不是标准的 JS 确认对话框,对吧?编辑:不,设置器根本不会在更改时调用。我删除了&lt;p:ajax&gt;
    • 是的,我完全同意你的看法。我误解了 “请注意,这里没有“取消”ajax 请求的方法。” 作为 “你不能” 而不是 “在这个解决方案中你不能”。抱歉!
    • 第一个解决方案对我不起作用,它从 selectOneMenu 中获取旧值而不是新值
    • @JohnB:它确实不会在打开之前使用输入值更新确认对话框,因为当前形式的问题没有涵盖该要求。
    猜你喜欢
    • 2013-01-06
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 2012-05-20
    • 1970-01-01
    • 2020-08-03
    相关资源
    最近更新 更多