javascript - 通过 AJAX 调用问题 knockout 自定义验证

标签 javascript ajax validation knockout.js

我的自定义验证将验证在表单字段中输入的邮政编码对于从前面字段的下拉列表中选择的州是否有效。当我第一次选择一个州,然后输入有效/无效的邮政编码时,它工作正常。但是,如果它验证,然后我去选择不同的状态,则验证错误消息不会触发。谁能告诉我我缺少什么以及为什么它没有重新验证?

自定义验证:

ko.validation.rules["isValidZipCode"] =
    {
        async: true,
        getValue: function (o) {
            return (typeof o === 'function' ? o() : o);
        },
        validator: function (val, fields, callBack) {
            var self = this;
            var anyOne = ko.utils.arrayFirst(fields, function (field) {
                var val = self.getValue(field);

                if (val === undefined || val === null) 
                    return "";                
                return true;
            });

            var ajaxData = { state: anyOne, zipCode: val }
            $.ajax({
                url: $("a#ValidateZipByState").attr("href"),
                type: "POST",
                data: ajaxData,
                success: function (isValid) {
                    if (isValid) {
                        callBack(true);
                    } else {
                        callBack(false);
                    }
                },
                error: handleSubmitError
            });

            return;
        },
        message: "Invalid zip code for this state"
    };

View 模型:

self.State = ko.observable(model.State).extend({ required: true });
self.ZipCode = ko.observable(model.ZipCode).extend({ required: true, pattern: /^[0-9]{5}(?:-[0-9]{4})?$/g, isValidZipCode: [self.State, self.ZipCode] });

最佳答案

您可以添加对 State 的订阅,并使用 ko.validation.validateObservable 方法来触发对 ZipCode 的验证 - 另外,由于此验证规则特定于 ZipCode,因此您可以使用匿名自定义规则规则。

self.State = ko.observable("StateB").extend({ 
    required: true
});

self.State.subscribe(function(){
    ko.validation.validateObservable(self.ZipCode);
})

self.ZipCode = ko.observable(789).extend({
    validation: {
        async: true,
        validator: function (val, params, callback) {
            setTimeout(function() {
                var zips = stateZips.get(self.State());
                var exists = zips.some(function(zip) {
                    return zip == new Number(val);
                });
                return callback(exists);
            });
        },
        message: "Invalid zip code for this state"
    }
});

此处的完整示例:JSFiddle

编辑:为了使 State 触发验证(不首先更改 ZipCode),您必须使用:

ko.validation.init({ messagesOnModified: false });

关于javascript - 通过 AJAX 调用问题 knockout 自定义验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42234050/

相关文章:

javascript - 如何将 php 中的数组返回给 $.ajax 成功函数

regex - 引用 - 密码验证

javascript - 如果一个或多个 if 语句为 false Javascript,如何返回 false 并停止发送电子邮件?

javascript - 在窗口滚动时更改导航事件类

javascript - HTML5 <canvas> 无抗锯齿

javascript - Famo-us Surface 内的 Google map 无法在移动设备上拖动

validation - 验证 CodeIgniter 中的组合框

javascript - ~~ 在 javascript 中是什么意思?

javascript - angularjs,ui-router访问状态url开头的参数

javascript - Ajax - 在发送请求之前检查 url 是否存在的函数