使用Parsley添加自定义多个验证

时间:2014-11-20 22:12:59

标签: validation parsley.js

是否可以在Parsley中添加自定义多重验证(即依赖于多个输入的单一验证)?

我有时希望验证<form>或整个部分,并在该级别而不是<input>级别提供错误。

例如,假设一个带有<table>的表单允许用户输入颜色和大小的不同组合。说我想验证没有重复的组合。最佳方法是验证每行的行并查找其上方的重复行。如果找到重复的行,则这些整行是无效的,没有任何单独的输入实际上无效。此外,任何字段的更改都可能使该行或其他行无效。

如果我尝试在"tr.combination"选项中添加inputs,则<table>不会添加fields。看起来这些选项没有传递给构造函数,因此它不会返回ParsleyField而是返回一个通用的Parsley对象。

我构建ParsleyFieldMultiple甚至更进一步,因为选择器是硬编码的,代码高度依赖于checkbox / radio

1 个答案:

答案 0 :(得分:3)

你想要完成的事情不能由Parsley本地完成。考虑到它似乎是一个非常具体的情况,您可能需要以下解决方案:

  1. 使用Parsley events执行验证
  2. ,而不是创建自定义验证程序
  3. 根据重复组合的存在,调整ParsleyForm.validationResult
  4. 这不是最优雅的解决方案,但我认为它是最简单的解决方案。实际上,我认为你无法找到解决这个问题的优雅解决方案。

    您可以在此working jsfiddle进行测试。

    // bind event after form validation
    $.listen('parsley:form:validated', function(ParsleyForm) {
        // We only do this for specific forms
        if (ParsleyForm.$element.attr('id') == 'myForm') {
            var combinations = [];
    
            // foreach tr
            ParsleyForm.$element.find('tr').each(function() {
                var tr = $(this);
    
                // if there are any inputs
                if (tr.find('input').length > 0) {
                    // Add a new combination based on tr's inputs
                    combinations.push(tr.find('input:first').val() + '|' + tr.find('input:last').val());
                }
            });
    
            // sort array
            combinations = combinations.sort();
    
            // check if there are duplicate combinations
            for (var i = 0; i < combinations.length - 1; i++) {
                // if two combinations are equal, show message
                // and force validation result to false
                if (combinations[i + 1] == combinations[i]) {
                    ParsleyForm.validationResult = false;
    
                    $("#form-message-holder")
                        .html('There are some errors with your form')
                        .css('display', 'block');
                    return false;
                }
            }
    
            // otherwise, validation result is true and hide the error message
            ParsleyForm.validationResult = true;
            $("#form-message-holder")
                .html('')
                .css('display', 'none');
        }
    });