有没有办法将<select>
元素绑定到对象数组(例如[ { foo: 5, bar: 10 }, ... ]
,以便jquery validate会将其视为已选中?
以下是问题,如果未指定optionsValue
,则<option>
元素将不会设置value=
属性(Knockout将负责更新value
目标)。但是从jQuery Validate透视表示<select>
选定值($(element).val()
)为""
。
有没有办法在没有自定义jQuery验证规则的情况下处理这个问题?
答案 0 :(得分:0)
如果$(element).val()
始终为空,那么即使是自定义规则/方法也无效。
但是,对于人们想要验证无法以任何原因直接验证的元素的情况,有一种解决方法。您可以使用隐藏的input
元素来存储值,并强制验证此隐藏元素。
...一般地
通过操纵the ignore
option启用隐藏字段的验证。将其设置为[]
将告诉它不要忽略任何内容。
在<select>
附近创建隐藏字段。 <input type="hidden" name="selectvalue" />
。请注意,您在标记中放置此隐藏元素会影响错误消息的位置。你可以利用这个优势。
编写change
处理程序并将其绑定到<select>
元素。因此,每次进行选择时,您都可以将任何相关值复制到隐藏元素中。
$('select').on('change', function() {
// some code to copy the value into your hidden element
$('[name="selectvalue"]').val(somevalue);
});
然后使用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();
});
由于错误消息现在默认显示在隐藏元素之后,因此您可以根据需要使用the errorPlacement
option将消息放入新位置。您可以有条件地执行此操作以保留其他元素的默认消息放置。您可能不需要执行此步骤,具体取决于放置隐藏元素的位置。
errorPlacement: function(error, element) {
if ($(element).is(':hidden')) {
error.inserBefore(element); // whatever custom placement
} else {
error.insertAfter(element); // default placement
}
}
不要忘记从<select>
元素中删除任何验证规则,因为您不再直接验证它。
否则,如果您只是验证正在进行的选择而不一定是否有值,则可以编写一个自定义方法,仅执行该操作...检查是否已进行选择并忽略空值。 / p>
如果您没有看到更多代码或了解更多有关您的要求,这是我能为您做的最好的。