Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何对绑定字段进行远程jquery验证?_Javascript_Jquery_Jquery Validate - Fatal编程技术网

Javascript 如何对绑定字段进行远程jquery验证?

Javascript 如何对绑定字段进行远程jquery验证?,javascript,jquery,jquery-validate,Javascript,Jquery,Jquery Validate,假设我有两个输入字段-它们的组合必须是唯一的。 它们中的每一个都会触发远程验证方法——这两个字段的方法都是相同的。如果组合是唯一的,则返回true。 问题如下:在验证错误后,我更改了字段(未标记为错误),即使方法返回true(这对字段是唯一的),错误字段仍被认为是错误的 我甚至不需要向服务器发出额外的请求,因为这对夫妇是独一无二的!我只需要清除字段的错误,标记为错误。然而,我还没有做到这一点——似乎jquery没有为此提供功能 有什么想法吗 相关代码非常庞大,但关键部分如下: this.clea

假设我有两个输入字段-它们的组合必须是唯一的。 它们中的每一个都会触发远程验证方法——这两个字段的方法都是相同的。如果组合是唯一的,则返回true。 问题如下:在验证错误后,我更改了字段(未标记为错误),即使方法返回true(这对字段是唯一的),错误字段仍被认为是错误的

我甚至不需要向服务器发出额外的请求,因为这对夫妇是独一无二的!我只需要清除字段的错误,标记为错误。然而,我还没有做到这一点——似乎jquery没有为此提供功能

有什么想法吗

相关代码非常庞大,但关键部分如下:

this.clearErrors = function ($elements) {
    var $validator = $elements.first().closest('form').validate();
    $elements.each(function(index, item) {
        var $parent = $(item).parent();
        var element = $(item).get(0);
        if ($parent.is('td')) {
            $parent.removeClass(window.resources.errorCellClass);
        }
        $parent.find('span.' + window.resources.errorSpanClass).remove();
        $validator.successList.push(element);
        delete $validator.invalid[element.name];
        delete $validator.submitted[element.name];
    });
};

//Fixing remote method, since original one returned "pending" status all the time, as reported in other stackoverflow question
    $.validator.addMethod('synchronousRemote', function (value, element, param) {
        if (this.optional(element)) {
            return 'dependency-mismatch';
        }

        var previous = this.previousValue(element);
        if (!this.settings.messages[element.name]) {
            this.settings.messages[element.name] = {};
        }
        previous.originalMessage = this.settings.messages[element.name].remote;
        this.settings.messages[element.name].remote = previous.message;

        if (typeof param == 'string') {
            param = { url: param }
        }

        if (previous.old === value) {
            return previous.valid;
        }

        previous.old = value;
        var validator = this;
        this.startRequest(element);
        var data = {};
        data[element.name] = value;
        var valid = 'pending';
        $.ajax($.extend(true, {
            url: param,
            async: false,
            mode: 'abort',
            port: 'validate' + element.name,
            dataType: 'json',
            data: data,
            success: function (response) {
                validator.settings.messages[element.name].remote = previous.originalMessage;
                valid = response === true || response === 'true';
                if (valid) {
                    var submitted = validator.formSubmitted;
                    validator.prepareElement(element);
                    validator.formSubmitted = submitted;
                    validator.successList.push(element);
                    delete validator.invalid[element.name];
                    validator.showErrors();
                } else {
                    var errors = {};
                    var message = response || validator.defaultMessage(element, 'remote');
                    errors[element.name] = previous.message = $.isFunction(message) ? message(value) : message;
                    validator.invalid[element.name] = true;
                    validator.showErrors(errors);
                }
                previous.valid = valid;
                validator.stopRequest(element, valid);
            }
        }, param));
        return valid;
    });

    $root.filter(':input[data-excluded-values-method]:not([readonly])').add($root.find(':input[data-excluded-values-method]:not([readonly])')).each(function () {
        var $element = $(this);
        $element.validate({
            onkeyup: false
        })
        var $entityContainer = $element.closest('[data-entity]');
        var $keyFields = $entityContainer.filter('INPUT[data-is-key]:not([disabled])').add($entityContainer.find('INPUT[data-is-key]:not([disabled])'));
        var localizedNames = [];
        $keyFields.each(function () {
            localizedNames.push($(this).attr('localized-name'));
        });
        $element.rules('add',
        {
            synchronousRemote: function () {
                var key = [];
                var keyIsUnique = true;
                $keyFields.each(function () {
                    key.push($(this).val());
                });
                return {
                    url: $element.attr('data-excluded-values-method'),
                    type: 'POST',
                    async: false,
                    data: JSON.stringify({
                        key: key,
                        entityType: $entityContainer.attr('data-entity')
                    }),
                    contentType: 'application/json; charset=utf-8',
                    dataType: 'json',
                    dataFilter: function (isUnique) {
                        keyIsUnique = isUnique;
                        return isUnique;
                    },
                    complete: function () {
                        if (keyIsUnique === 'true') {
                            window.commonUtils.clearErrors($keyFields.filter('[name!="' + $element.attr('name') + '"]:input[data-excluded-values-method]:not([readonly])'));
                        }
                    }
                }
            },
            messages: {
                synchronousRemote: $.validator.format(window.resources.notUniqueValidationError)(localizedNames.join(' + '))
            }
        });
    });

我已经调试了jquery validate方法,并找到了要清除验证错误还应该设置的内容:

$validator.previousValue(element).valid = true;

现在一切正常。

各位,请停止投票!如果你没什么可说的,就过去吧!我试着把我的问题描述得尽可能简短,这样你就更容易理解这个问题了。后来,我添加了代码,甚至添加了适合我的解决方案。然而,有一个非常聪明的人一直在投反对票。。。天知道,事实上这对我很有用。在这里,几乎所有与此相关的问题都与“规则”有关,因为这是一种“方法”。我完全理解其中的区别,但有时你需要一个方法而不是规则,原因与此无关。因此,答案似乎是,如果你需要使用远程方法(而不是规则),那么你需要从插件中破解相关的规则代码,并一字不差地重复使用。如果您错过了一个或多个神奇的咒语,那么您将填充错误处理。Phillw-是的,看起来jquery在某些情况下需要被黑客攻击才能正常工作。曾经在jquery库中遇到另一个问题并决定升级到最新版本。结果:事实证明,所需的功能根本没有在那里实现。因此,我不得不使用我的原型回滚并修补一些方法:)