Foundation 6 Abide 自定义验证 ajax

Foundation 6 Abide custom validation with ajax

使用 Foundation 6 Abide,我创建了一个自定义验证器,它需要根据模式检查用户名字段,并让它连接到服务器以查看用户名是否已注册。当执行自定义验证器时,它首先根据正则表达式模式测试用户名 - 如果成功,它然后对服务器执行 ajax 调用以查看用户名是否存在。由于 javascript 不等待,自定义验证器函数 returns "true" 指示一切正常。 ajax 调用完成后,如果找到用户名,它会调用该字段上的 "addErrorClasses"。这完美地工作,但是我担心因为验证器之前 returned "true" 因为它不想等待 ajax,所以现在没有办法 return "false" 并且表单会认为它处于有效状态。

问题:调用 addErrorClasses 函数是否会将字段标记为无效,然后会使表单处于无效状态?

Foundation.Abide.defaults.validators.validate_username =
    function($el,required,parent) {
    // parameter 1 is jQuery selector
        if (!required) return true;

        let val = $el.val();

        // Step 1 - check that it meets the pattern
        if (!val.length)
            return true;

        let valid = new RegExp(username_pattern).test(val);
        if (!valid)
            return false;

        // Step 2 - check that the username is available
        $.ajax({
            url: "http://localhost:3000/users/"+val,
        }).done(function(data) {
            $('#demo-form').foundation('addErrorClasses',$el);
            console.log(data);
        }).fail(function() {
            // do nothing for now
        });

        return true;
};

是的,通过调用 addErrorClasses 会将控件标记为 'invalid',但这取决于您调用该方法的位置和方式。

由于您正在执行 ajax(即异步),因此默认情况下 return 为真。到那时,您的控件将是 'valid',当 ajax 收到来自 'url' 的响应时,它会根据您的代码设置 'invalid'。

当您尝试提交表单时,基础框架会重置所有控件,即它会删除所有 'data-invalid' 属性,然后执行所有默认和自定义验证器。还是你的方法 return 正确。它不会等待您的 ajax.

的响应

即使您的控件出现错误,也会提交表单。