2010-04-29 37 views
0

我有很多用於驗證的正則表達式。我沒有爲每個正則表達式手動輸入很多addMethods,而是嘗試使用循環。我有下面的模擬結構來保存正則表達式名稱,RegExp對象和驗證消息。jQuery驗證插件 - 在循環中使用validator.addMethod

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; } 
     } 
    } 
); 

回答

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]); 

}