[英]Stop event from continuing on deferred.reject
希望你们中的一些人可以帮助我解决这个问题。
我的应用程序顶部有一些导航链接,它们具有活动和非活动状态。 从理论上讲,我想从一个跳到另一个,并且如果存在一种形式不完整/无效的表格,我会触发验证错误并停留在同一页面上。 在我的情况下,表单验证工作正常,但是顶部的导航链接从非活动状态更改为活动状态,无论单击哪个状态。
我有一个ValidateForm函数,该函数可以验证并提交表单(如果表单有效),否则返回deferred.reject();。
function ValidateForm(submitAnyway) {
var deferred = $.Deferred();
var form = $('form');
// if form doesn't exist on the page - quit
if (typeof form[0] === "undefined") return true;
// now check for any validation errors
if (submitAnyway) {
if (!$(form).valid()) {
deferred.reject();
} else {
$(form).submit();
deferred.resolve();
}
} else {
deferred.resolve();
}
return deferred.promise();
}
对于这些顶部导航链接,我有一个点击事件,如下所示:
var DonutsClickEvent = function (e, arg) {
var url = $(this).attr('data');
var data = { param: arg };
if (typeof url === "undefined") return false;
$.when(window.ValidateForm(false)).then(
function () {
LoadPartialView_Main(url, data);
},
function(){
return false; // I'm trying to return false here to stop event from continuing
}
);
Console.log("This statement runs before $.when completes");
// and event continues and the clicked nav button changes
// its state from non-active to active, even though form doesn't validate
}
我最近在代码中添加了$ .Deferred功能,因为某些事件触发了混乱的序列...在我的validateForm方法返回true或false之前,基于此我将继续执行事件(如果为true,如果为false),我将停止一切都很好。
不知道我在做什么错。 我将不胜感激。
谢谢!
强尼
您无法异步决定是否要阻止默认操作。 到获得异步结果时,您的函数已经返回,并且默认操作已发生。
如果必须异步验证,则必须始终阻止默认操作。 如果验证成功,那么您将必须使用Javascript手动执行所需的操作。
因此,假设LoadPartialView_Main()
是验证成功后想要发生的事情,则可以执行以下操作:
var DonutsClickEvent = function (e, arg) {
var url = $(this).attr('data');
var data = { param: arg };
if (typeof url === "undefined") return false;
window.ValidateForm(false).then(function () {
LoadPartialView_Main(url, data);
}, function(err){
// probably show validation error message to the user here
});
// always prevent default action
return false;
}
另外,没有理由将$.when()
与单个诺言一起使用。 您可以只使用window.ValidateForm(...).then(...)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.