2013-07-03 56 views
1

我想驗證孩子年齡的條目。有效值爲'< 1'和1-29。基因敲除驗證 - 自定義驗證器

爲此,我試圖創建像下面這樣的自定義驗證器。

我假設這些驗證器按順序工作,所以我一直在移動它們。

使用情況下,我「米測試:

  1. 用戶輸入30,扔‘必須小於29’錯誤
  2. 用戶輸入0或沒有,拋出‘請說怎麼老’錯誤
  3. 用戶輸入'6個月,則拋出錯誤對於他們改變值「< 1」
  4. 用戶輸入「< 1」沒有錯誤
  5. 用戶輸入1或2或3或4 ...,沒有錯誤

我還沒有能夠通過所有這些測試。 #5失敗。

var ChildModel = function(cookieAge){ 
    var self = this, 
     age = cookieAge || ""; 
    self.age = ko.observable(age).extend({ 
     validation: [{ 
      validator: function (val) { 
       return val !== "" || parseInt(val,10) === 0; 
      }, 
      message: 'Please say how old this child is.' 
     },{ 
      validator: function (val, someOtherVal) { 
       return val=== "<1" || val <= someOtherVal; 
      }, 
      message: "This child's age must be less than or equal to 29.", 
      params: 29 
     },{ 
      validator: function (val) { 
       var text = val.match(/(\D+)/g); 
       log(text); 
       return val.match(/^[0-9].$/) || text && text.length > 0; 
      }, 
      message: "(contains text) For Children less than 1, please use '<1'" 
     }] 
    }); 
}; 

回答

3

我發現將兩個驗證規則合併爲一個幫助緩解了一些複雜性。如果提供的值是數字,則組合的驗證規則會短路並返回true,這樣它將不會無意中嘗試檢查值是否與'< 1'匹配。

我還利用isEmptyVal實用程序方法來幫助檢測值是否爲空。我試着用validation:旁邊的一些內置的驗證規則,但發現它們沒有工作,我想這有一些限制。

validation: [{ 
     validator: function (val) { 
      return !ko.validation.utils.isEmptyVal(val) && parseInt(val,10) !== 0; 
     }, 
     message: 'Please say how old this child is.' 
    },{ 
     validator: function (val, someOtherVal) { 
      if (!isNaN(val)) { 
       if (val > someOtherVal) { 
        this.message = "This child's age must be less than or equal to 29."; 
        return false; 
       } 
       return true; 
      } 

      if (val !== '<1') { 
       this.message = "(contains text) For Children less than 1, please use '<1'"; 
       return false; 
      } 
      return true; 
     }, 
     params: 29 
    }] 

小提琴http://jsfiddle.net/Rkkha/

+0

謝謝!我很感激。 – Scott