这是我的目标:
将打开“自定义启动箱”对话框以指定值。用户指定一个值,单击“保存”,并通过Ajax调用将值传递给Web应用程序。
Web应用程序验证该值并发回"成功"消息,如果验证通过并且数据库已更新或发回"失败"有验证失败原因的消息。
如果"成功"收到消息对话框关闭,否则再次打开并在用户输入下方显示验证消息。用户可以更改输入并再次单击“保存”,或按“取消”关闭对话框。
MCVE(注意 while(bContinue == true)被注释掉,表明它没有循环工作,并且在任何地方都没有验证消息,但它将是Message变量的一部分(在Ajax调用后,该变量将在Save回调函数中更新)):
$(document).on("click", ".alert", function(e) {
var Message = "<label class='control-label col-sm-1' style='width:30px;' for='assignmentname'>"+"Assignment "+"</label>"
+ "<input type='text' id='assignmentname' class='form-control' style='float: left; max-width:800px;' value='Initial value'>"
var bContinue = true;
//while(bContinue == true)
{
bootbox.dialog({
size: "large",
message: Message,
title: "Edit Assignment",
buttons: {
save:
{
label: "Save",
className: "btn btn-success",
callback: function() {
// perform Ajax call to the web application
// and set bContinue to true or false depending on
// return value
bContinue = true;
}
},
cancel:
{
label: "Cancel",
className: "btn btn-default",
callback: function() {
// exit out of the loop
bContinue = false;
}
}
}
});
}
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
<script src="https://github.com/makeusabrew/bootbox/releases/download/v4.4.0/bootbox.min.js"></script>
<p><a class="alert" href=#>Click here</a></p>
&#13;
问题是 - 只要而(bContinue == true)未注释,对话框就永远不会打开。
预期的MCVE行为:对话框打开,如果单击“保存”,则会关闭并重新打开。如果单击取消 - 对话框将关闭。
答案 0 :(得分:1)
问题不在Bootbox中,问题出在while循环中,在没有等待Bootbox加载的情况下保持循环非常快,并且它使整个浏览器挂起:)
因此您需要更改逻辑,可以将Bootbox对话框放在一个函数中,并在保存时再次调用该函数。
或者可能正在使用承诺:How to use confirm alert and return an AJAX promise?