jQuery验证所需规则认为值为空,即使选择了值

时间:2015-06-20 15:32:24

标签: jquery knockout.js jquery-validate

有没有办法将<select>元素绑定到对象数组(例如[ { foo: 5, bar: 10 }, ... ],以便jquery validate会将其视为已选中?

以下是问题,如果未指定optionsValue,则<option>元素将不会设置value=属性(Knockout将负责更新value目标)。但是从jQuery Validate透视表示<select>选定值($(element).val())为""

有没有办法在没有自定义jQuery验证规则的情况下处理这个问题?

1 个答案:

答案 0 :(得分:0)

如果$(element).val()始终为空,那么即使是自定义规则/方法也无效。

但是,对于人们想要验证无法以任何原因直接验证的元素的情况,有一种解决方法。您可以使用隐藏的input元素来存储值,并强制验证此隐藏元素。

...一般地

  1. 通过操纵the ignore option启用隐藏字段的验证。将其设置为[]将告诉它不要忽略任何内容。

  2. <select>附近创建隐藏字段。 <input type="hidden" name="selectvalue" />。请注意,您在标记中放置此隐藏元素会影响错误消息的位置。你可以利用这个优势。

  3. 编写change处理程序并将其绑定到<select>元素。因此,每次进行选择时,您都可以将任何相关值复制到隐藏元素中。

    $('select').on('change', function() {
        // some code to copy the value into your hidden element
        $('[name="selectvalue"]').val(somevalue);
    });
    
  4. 然后使用the .valid() method强制对隐藏元素进行验证。这将是change处理程序中的最后一行。

    $('select').on('change', function() {
        // some code to copy the value into your hidden element
        $('[name="selectvalue"]').val(somevalue);
        // force validation of the hidden element
        $('[name="selectvalue"]').valid();
    });
    
  5. 由于错误消息现在默认显示在隐藏元素之后,因此您可以根据需要使用the errorPlacement option将消息放入新位置。您可以有条件地执行此操作以保留其他元素的默认消息放置。您可能不需要执行此步骤,具体取决于放置隐藏元素的位置。

    errorPlacement: function(error, element) {
        if ($(element).is(':hidden')) {
            error.inserBefore(element); // whatever custom placement
        } else {
            error.insertAfter(element); // default placement
        }
    }
    
  6. 不要忘记从<select>元素中删除任何验证规则,因为您不再直接验证它。

  7. 否则,如果您只是验证正在进行的选择而不一定是否有值,则可以编写一个自定义方法,仅执行该操作...检查是否已进行选择并忽略空值。 / p>

    如果您没有看到更多代码或了解更多有关您的要求,这是我能为您做的最好的。