当单个字段在没有无限递归的情况下发出成功事件时,我无法在 Parsley 中触发验证

I'm unable to trigger validations in Parsley when a single field emits a success event without infinite recursion

我在一个表单中有许多不同的部分,每个部分的输入必须等于第一个输入(在它自己的部分)才能验证表单。

验证工作正常,唯一的问题是 UI 在用户尝试验证某个部分中包含不正确数字的情况下,在该部分的其余部分显示错误。在这种情况下,该部分中的每个输入都会显示错误。这很棒。但是,当用户更改其中一个字段中的数字时,总数现在是正确的,parsley 只会清除该特定字段中的错误。

下面是运行良好的代码,只是没有清除错误:

window.ParsleyValidator
    .addValidator('sumTotal', function (value, group) {
        // get total enrollment number
        var totalInput = $('#enrollment-group').find('[data-parsley-sum-total="all"]')
        var totalEnrollment = parseInt(totalInput.val())
        // sum up input values for the section
        var sectionSum = 0;
        $('#enrollment-group').find('[data-parsley-sum-total="' + group + '"]').each(function(){
            if ($(this).val()) sectionSum += parseInt($(this).val()); 
        })
        // if no inputs, don't consider the section
        if (sectionSum === 0)  return true
        return totalEnrollment === sectionSum;
    }, 32)
    .addMessage('en', 'sumTotal', 'The total sum for all %s fields must equal the total enrollment above: ' + $('#enrollment-group').find('[data-parsley-sum-total="all"]').val());
// exclude the 'total enrollment' input from the sum validation
$('form').parsley({ excluded: '[data-parsley-sum-total="all"]' });

下面是我试图清除错误但最终以无限递归结束的代码示例:

$('form').parsley().subscribe('parsley:field:success', function(input){

    $.each($('[data-parsley-sum-total]'), function(i, value){
        if ($(value).hasClass('parsley-error')){
            $(value).parsley().validate()
        }
    })
});

那么,如何在该部分有效后清除该部分输入的所有错误?

这是在 django 管理模板中,所以我必须在 parsley.js 加载后添加我的自定义验证器。在此先感谢您的帮助。

好吧,经过一番折腾后我弄明白了,这是给遇到类似问题的人的:

window.ParsleyValidator
    .addValidator('sumTotal', function (value, group) {
        // get total enrollment number
        var totalInput = $('#enrollment-group').find('[data-parsley-sum-total="all"]')
        var totalEnrollment = parseInt(totalInput.val())
        // sum up input values for the section
        var sectionSum = 0;
        $('#enrollment-group').find('[data-parsley-sum-total="' + group + '"]').each(function(){
            if ($(this).val()) sectionSum += parseInt($(this).val()); 
        })
        // if no inputs, don't consider the section
        if (sectionSum === 0)  return true
        return totalEnrollment === sectionSum;
    }, 32)
    .addMessage('en', 'sumTotal', 'The total sum for all %s fields must equal the total enrollment above: ' + $('#enrollment-group').find('[data-parsley-sum-total="all"]').val());
// exclude the 'total enrollment' input from the sum validation
$('form').parsley({ excluded: '[data-parsley-sum-total="all"]' });
// clear other errors in section if one field emits success event
$('form').parsley().subscribe('parsley:field:success', function(input){
    $.each($('[data-parsley-sum-total]'), function(i, value){
        if ($(value).attr('data-parsley-sum-total') == input.options.sumTotal){
            window.ParsleyUI.removeError($(value).parsley(), 'sumTotal')
            $(value).removeClass('parsley-error')
            $(value).addClass('parsley-success')
        }
    })
})