jQuery Validation Plugin - 在Loop中使用validator.addMethod

时间:2010-04-29 14:30:03

标签: asp.net javascript jquery validation

我有很多用于验证的正则表达式。我没有为每个正则表达式手动输入许多addMethods,而是尝试使用循环。我有下面的模拟结构来保存正则表达式名称,RegExp对象和验证消息。

function RegExs(exprName, expr, exprVM) {
    this.exprName = exprName;
    this.expr = expr;
    this.exprVM = exprVM;
}

在填充上面的数组之后,我遍历并执行addMethods,以便更新和维护更容易:

for (i in pgRegExs) {

    $.validator.addMethod(pgRegExs[i].exprName,
        function(value, element) {
            return this.optional(element) || pgRegExs[i].expr.test(value);
        },
        function(value, element) { return pgRegExs[i].exprVM; }
    );
}

然而,验证器似乎没有拿起正则表达式。它确实获得了名称和验证消息。有线索吗?

更新:更正:验证器正在拾取函数数组,但数组中的最后一个应用于每个输入。如果我有:

pgRegExs = [
  new RegExs("addrCustName", regExAddrCustName, regExAddrCustNameVM),
  new RegExs("addrStreet", regExZipCodeLng, regExZipCodeLngVM),
  new RegExs("addrCity", regExZipCodeLng, regExZipCodeLngVM),
  new RegExs("zipcodeLng", regExZipCodeLng, regExZipCodeLngVM),
  new RegExs("emailFormat", regExEmailAddr, regExEmailAddrVM),
  new RegExs("emailLength", regExEmailAddrLen, regExEmailAddrLenVM)
];

emailLength正则表达式应用于每个输入。下面,addrCustName应该应用于输入字段,但是使用emailLength。

$("[id$='_tbFName']").rules("add",
    {
        required: true,
        addrCustName: true,
        messages: {
            required: "First name required",
            addrCustName: function(value, element) { return regExAddrCustNameVM; }
        }
    }
);

1 个答案:

答案 0 :(得分:0)

我需要使用闭包:

for (i in pgRegExs) {

    (function(pgRegEx) {

        $.validator.addMethod(pgRegEx.exprName,
            function(value, element) {
                return this.optional(element) || pgRegEx.expr.test(value);
            },
            function(value, element) { return pgRegEx.exprVM; }
        );

     })(pgRegExs[i]);

}