建立this SO question,我试图将两个变量传递给自定义验证器方法。使用console.log
我可以看到上面的&较低的范围是在HTML中定义的,但未正确传递给选项,而是取而代之的是NaN
。
问题似乎是两个文本框的值尚未定义或设置(当它们在下面的验证规则中发送时),但是当它们到达验证器时(这只是一个猜测,我还没有能够在验证尝试之前想出一种方法来嗅探它们的值。因此,如果我将它们记录在验证器方法中,它们会显示正常,但如果我将它们作为变量传递,它们会在PCBID对象(Chrome浏览器)中显示为NaN:
Object {PCBID: Object}
PCBID: Object
lower: NaN
upper: NaN
__proto__: Object
__proto__: Object
这里是验证器,还有其他规则可以防止输入整数,因此不应该出现问题:
//this validator checks to make sure the user has entered the PCBIDs in
//the correct order in the range form.
$.validator.addMethod("highLowCheck", function (value, element, options)
{
console.log("Inside highLowCheck validator");
console.log(parseInt($('#pcbid_range_lower').val(),10)); //shows expected values
console.log(parseInt($('#pcbid_range_upper').val(),10)); //shows expected values
console.log(options.PCBID.upper); //NaN
console.log(options.PCBID.lower); //NaN
//evaluates to false because NaN is falsey
console.log(options.PCBID.upper > options.PCBID.lower);
console.log("Done logging");
return options.PCBID.upper > options.PCBID.lower;
}
);
以下是我试图传递的变量:
pcbid_range_upper: {
required: true,
digits: true,
rangelength: [3, 6],
highLowCheck:
{ PCBID:
{
//this doesn't work
lower: parseInt($('#pcbid_range_lower').val(),10),
upper: parseInt($('#pcbid_range_upper').val(),10)
}
},
如果我传递这样的原始值:
highLowCheck:
{ PCBID:
{
lower: 1000, //works
upper: 2000
}
},
这种方法有效,但它不是很有用,因为用户可以输入他们喜欢的任何值,所以我必须能够将它们作为变量传递。我还需要这个来处理变量,因为我需要从多个验证例程调用它,否则我只是直接使用验证器中的变量(因为我需要多个表单才能使用验证器)。
如果它有用,这里是两个输入的HTML:
<div data-role="fieldcontain" data-controltype="textinput" class="pcbid_selections" tabindex="2">
<label for="pcbid_range_lower">Starting PCBID *</label>
<input name="pcbid_range_lower" id="pcbid_range_lower" class="create_group" placeholder="52759" value="" type="text" data-mini="true" />
</div>
<div data-role="fieldcontain" data-controltype="textinput" class="pcbid_selections" tabindex="3">
<label for="pcbid_range_upper">Ending PCBID *</label>
<input name="pcbid_range_upper" id="pcbid_range_upper" class="create_group" placeholder="52769" value="" type="text" data-mini="true">
</div>
问题: 如何将规则内的变量传递给自定义验证器?
修改
解决方案:感谢@Sparky&amp; Mathletics
验证器方法已更改为仅接收我想传递的两个变量的名称的字符串,而不是其内容。然后使用@ Mathletic的建议,我只需将它们放入jQuery变量形式里面验证器:
//this validator checks to make sure the user has entered the PCBIDs in the
//correct order in the range form.
$.validator.addMethod("highLowCheck", function (value, element, options){
return parseInt($('#' + options.PCBID.upper).val(), 10) >
parseInt($('#' + options.PCBID.lower).val(), 10);
}
);
并从规则中调用它们:
highLowCheck:
{
PCBID:
{
lower: 'pcbid_range_lower',
upper: 'pcbid_range_upper'
}
},
对于任何发现这一点的人来说,只是一个FYI,我尝试用规则中的字符串(#:'#pcbid_range_lower'
)传递英镑符号(&#34;#&#34;)但是没有&# 39;似乎工作。这个方法可以,你只需要预先添加&#34;#&#34;在验证器方法中,而不是很好。
答案 0 :(得分:4)
引用OP :
&#34;问题:如何将规则中的变量传递给自定义验证器?&#34;
在.validate()
...
rules: {
myField: {
customMethod: [1, "two", 3, "foo"]
}
}
customMethod
已定义...
$.validator.addMethod("customMethod", function (value, element, options) {
console.log(options[0]); // <- 1
console.log(options[1]); // <- "two"
console.log(options[2]); // <- 3
console.log($('[name=' + options[3] + ']').val()); // <- value of field named "foo"
console.log(value); // <- the value of "myField"
console.log(element); // <- the "myField" object
// your function
}, "Custom message with options used as {0}, {1}, {2}, {3} etc.");