如果选择了选项,则为欧芹自定义验证器

时间:2015-04-17 17:33:11

标签: javascript jquery coffeescript parsley.js custom-validators

我有一个带有几个选项的选择框,如果有人选择其他我希望文本框淡入并且需要它,只要让它显示我很好用,验证器是我遇到问题的地方。

这是我到目前为止所尝试的内容,主要基于可用的一个示例。

conditionalvalue:
    fn: (value, requirements) ->
        if requirements[1] == $(requirements[0]).val()
            return false
        true

在我的领域我有这个

data-parsley-conditionalvalue='["[name=\"volunteer-check-in-new-name-title-select\"]", "other"]'

这里参考我的选择框是什么

<select name="volunteer-check-in-new-name-title-select" data-bind="volunteer-new-final-title-field">
    <option value="dr">Dr.</option>
    <option value="mr">Mr.</option>
    <option value="mrs">Mrs.</option>
    <option value="miss">Miss.</option>
    <option value="ms">Ms.</option>
    <option value="other">Other</option>
</select>

我觉得它与不使用函数的值部分有关?我希望有更多关于此的文件。

2 个答案:

答案 0 :(得分:6)

您可以在不需要自定义验证器的情况下执行此操作(参见下文)。

如果您真的想使用自定义验证器,则需要:

  1. 确保属性data-parsley-conditionalvalue等于:["[name=\"volunteer-check-in-new-name-title-select\"] option:selected", "other"]

    注意option:selected,你需要添加它以通过javascript从选项中获取值。

  2. 您需要在您的字段中包含属性data-parsley-validate-if-empty。否则,验证程序将不会被执行,因为您的字段为空。

  3. 我无法说出来,但似乎您正在注册Examples page中的验证器。如果是这样,您需要确保尚未加载parsley.js。否则请选择look at the documentation

  4. 我留下这个工作代码(也带有available jsfiddle)。请注意,我在注册验证器之前加载Parsley。

    <form id="someForm">
        <select name="volunteer-check-in-new-name-title-select" data-bind="volunteer-new-final-title-field">
            <option value="dr">Dr.</option>
            <option value="mr">Mr.</option>
            <option value="mrs">Mrs.</option>
            <option value="miss">Miss.</option>
            <option value="ms">Ms.</option>
            <option value="other">Other</option>
        </select>
    
        <input type="text" name="otherTitle" data-parsley-validate-if-empty data-parsley-conditionalvalue='["[name=\"volunteer-check-in-new-name-title-select\"] option:selected", "other"]' />
        <input type="submit" />    
    </form>
    
    <script>
    $(document).ready(function() {
        window.ParsleyValidator
        .addValidator('conditionalvalue', function (value, requirements) {
            if (requirements[1] == $(requirements[0]).val() && '' == value)
                return false;
            return true;
        }, 32)
        .addMessage('en', 'conditionalvalue', 'You have to insert some value');
    
        $("#someForm").parsley();
    });
    </script>
    

    这应该这样做。


    如果您不想使用自定义验证器,则可以使用内置的data-parsley-required。基本逻辑是:当您更改字段volunteer-check-in-new-name-title-select时,请验证所选选项是否为other。如果是,则显示文本框并添加属性data-parsley-required并将Parsley应用于字段(check the documentation,您可以在其中看到欧芹可以绑定到特定字段)。

    如果所选选项不是other,请隐藏该字段,删除data-parsley-required属性并销毁该字段上的欧芹。

    您的代码将是这样的(您需要将其转换为coffeescript):

    <form id="someForm">
        <select name="volunteer-check-in-new-name-title-select" data-bind="volunteer-new-final-title-field">
            <option value="dr">Dr.</option>
            <option value="mr">Mr.</option>
            <option value="mrs">Mrs.</option>
            <option value="miss">Miss.</option>
            <option value="ms">Ms.</option>
            <option value="other">Other</option>
        </select>
    
        <input type="text" name="otherTitle" style="display: none;"/>
        <input type="submit" />    
    </form>
    
    <script>
    $(document).ready(function() {
        $("#someForm").parsley();
    
        $("select[name=volunteer-check-in-new-name-title-select]").on('change', function() {
            console.log($(this).val());
            if ($(this).val() === 'other') {
                $("input[name=otherTitle]")
                    .css('display', 'block')
                    .attr('data-parsley-required', 'true')
                    .parsley();
            } else {
                $("input[name=otherTitle]")
                    .css('display', 'none')
                    .removeAttr('data-parsley-required')
                    .parsley().destroy();
            }
        });
    });
    </script>
    

    实时版本位于this jsfiddle

答案 1 :(得分:0)

尝试了几种添加自定义验证器的方法之后,我意识到最快捷的方法是在下拉菜单更改时更新data-parsley-required属性。

$('#select_input_id').change(function(){
   if(this.value=='other') 
     $('#other_input_id').attr('data-parsley-required',false);
   else  
     $('#other_input_id').attr('data-parsley-required',true);
});