javascript - knockout 自定义验证ajax问题

标签 javascript knockout.js

我正在尝试验证输入到表单字段中的邮政编码对于从前面字段的下拉列表中选择的州是否有效。我将所有数据都放在一个表中,并且能够使用 ajax 调用进行确认。我下面的代码允许我使 ajax 调用返回 true/false,但我不确定如何根据返回值触发验证。有人有想法吗?

自定义验证:

ko.validation.rules["isValidZipCode"] =
    {
        getValue: function (o) {
            return (typeof o === 'function' ? o() : o);
        },
        validator: function (val, fields) {
            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) {
                        return true;
                    } else {
                        return 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] });

最佳答案

看起来您需要在验证定义中设置异步标志,然后您可以将结果返回给回调参数。 Reference

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) {
                callback(isValid);
            },
            error: handleSubmitError
        });

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

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

相关文章:

Javascript 根据 pray_name 获取每个值

javascript - 使用 javascript 获取 url

jquery - 如何将 event.preventDefault 与 KnockoutJs 单击事件处理程序一起使用?

javascript - 在 KnockoutJS 中向列表项添加 onclick 事件。

javascript - 在 1 页而不是 2 页中添加编辑功能

javascript - 使用 KnockoutJS 的项目选择 MVC View

javascript - Bootstrap 3 Modal 不会显示模态标题或输入标签

javascript - React JS 将组件添加到特定的点击行

knockout.js - 当源为空/未定义时模板绑定(bind)不起作用

javascript - 滑入菜单需要切换汉堡包选项