2013-07-03 2 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 
    }] 

Fiddle: http://jsfiddle.net/Rkkha/

+0

Спасибо! Я ценю это. – Scott