【问题标题】:Can Bootbox.confirm work synchronously?Bootbox.confirm 可以同步工作吗?
【发布时间】:2014-05-06 05:27:22
【问题描述】:

在一个aspx页面中,有一个像这样的asp:linkbutton:

<asp:LinkButton runat="server" ID="btExit" Text="Exit"
                OnClientClick="javascript:return confirmExit();" 
                EnableViewState="false" 
                OnClick="ExitButtonClick"></asp:LinkButton>

这是javascript函数:

<script type="text/javascript">
function confirmExit() {
    bootbox.confirm("Are you sure?", function (confirmed) {
        return confirmed;
    });
}
</script>

问题是,据我所知,bootbox.confirm 是异步工作的,后面代码上的 ExitButtonClick 函数无需等待用户确认即可执行。

我找到了一个可行的解决方案,使用隐藏按钮:

<asp:LinkButton runat="server" ID="btExit" Text="Exit"></asp:LinkButton>
<asp:Button runat="server" ID="btExitHidden" onclick="ExitButtonClick" style="display:none;" />

这是javascript部分:

<script type="text/javascript">
    $("#btExit").click(function (e) {
        e.preventDefault();
        bootbox.confirm("Are you sure?", function (confirmed) {
            if (confirmed) {
                $("#btExitHidden").click();
            }
        });
    });
</script>

我的问题是,是否有更“漂亮”和“标准”的方式与 Bootbox.confirm 同步工作,而不使用隐藏按钮。

【问题讨论】:

  • bootbox.confirm 绝不是异步的,它只是在有人确认与否时都有一个回调,所以是的,它可以同步使用,你已经在这样做了。
  • @adeneo 嗯,是的,它是异步的。当您调用bootbox.confirm 时,它会打开对话框然后继续执行。我们不知道用户何时会单击执行回调的按钮之一。它是异步发生的。

标签: c# javascript jquery asp.net bootbox


【解决方案1】:

您可以通过这种方式制作自定义同步引导盒功能:

function ayncBootbox(message, cb = null) { // cb : function
        return new Promise(resolve => {
            bootbox.confirm({
                message: message,
                buttons: {
                    confirm: {
                        label: "Yes"
                    },
                    cancel: {
                        label: "No"
                    }
                },
                callback: cb ? result => cb(resolve, result) : result => resolve(result)
            })
        })
}

如果你需要做一些额外的事情,你可以通过传递自定义回调来调用它

var result = await ayncBootbox("message", (resolve, result) => resolve(result))

或者只是

var result = await ayncBootbox("message")

PS:不要忘记将调用者函数设为异步 :) 如果需要,您可以使用拒绝扩展此代码

【讨论】:

    【解决方案2】:

    我的解决方案

    @Html.ActionLink("Delete", "DeleteReport", new { id = item.Id }, new { @class = "btn btn-danger", onclick = String.Format("return ASE.ConfirmAction(this.href, 'Delete {0}?');", item.Name) })
    
    var ASE = {
        ConfirmAction: function (href, text) {
            bootbox.confirm(text, function (result) {
                if (result)
                    window.location = href;
            });
    
            return false;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多