2011-09-12 72 views
2

我有一種情況,我創建一個不顯眼的驗證程序,必須驗證只有驗證字段不是空的時候才需要另一個字段(反之亦然)。問題是有一些邊界情況下,其他字段沒有重新驗證,我想強制它重新驗證自己而不會導致無限循環。驗證其他領域沒有造成無限循環

我的驗證方法是這樣的:

$.validator.addMethod("jqiprequired", function (value, element, params) { 
    if (!this.optional(element) || (this.optional(params) && this.optional(element))) { 
     return true; 
    } 

    return false; 
}); 

params爲我的其他領域(均爲文本框)。如果兩者都是空的,則它通過,如果兩者都有值,則通過。它只會失敗,如果只有一個有價值。

這工作正常,除了如果一個字段是空的,另一個有一個值,那麼你從字段中刪除值的值,空字段不重新驗證(因爲它的值沒有改變)。

我試着這樣做:

if (!this.optional(element) || (this.optional(params) && this.optional(element))) { 
    $('form').validate().element(params); 
    return true; 
} 

但是這會導致一個無限循環,因爲每經過一次,它調用其他。

我該如何導致其他字段驗證,而沒有自己調用原始字段?

回答

1

而不是向每個字段添加屬性,請嘗試在添加此驗證方法的腳本中添加變量jqip_validating。然後,如下改變你的驗證:

var jqip_calledFromOtherValidator = false; 
if (jqip_validating) { 
    jqip_validating = false; 
    jqip_calledFromOtherValidator = true; 
} 
if (!this.optional(element) || (this.optional(params) && this.optional(element))) { 
    if (!jqip_validating && !jqip_calledFromOtherValidator) { 
     jqip_validating = true; 
     $('form').validate().element(params); 
    } 
    return true; 
} 

爲了使其他驗證被調用,兩個條件必須滿足,他們只能滿足時,第一確認調用第二確認。

0

您可以將is_validating屬性添加到每個字段,以便如果它在您上面,則跳過驗證,如果沒有,則將其設置爲true,執行驗證並清除它。

+0

是的,我試過了。結果很奇怪。它有點奏效,但驗證是遍佈整個地方,有時會停止20到30次。看起來''.validate()'調用再次驗證整個表單。 –