繁体   English   中英

阻止事件在deferred.reject上继续

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM