2013-08-23 2 views
1

Мне нужно подтвердить дату в локализованном формате (SK), и это невозможно с проверкой нокаута.Проверка даты нокаута не работает правильно

Я использую: Дюрандаль 1.2.0 Knockout 2.3.0 Нокаут проверки https://github.com/Knockout-Contrib/Knockout-Validation

мне нужно что-то вроде этого, чтобы работать:

var newStartDate = ko.observable() 
.extend({ 
required: { message: 'Start date is required.' }, 
date: true, 
formattedDate: { format: 'ddMMyyyy', delimiter: '.' } 
}); 

Тогда, если я позвоню newStartDate.isValid () Я получаю следующие результаты:

newStartDate(""); 
false (OK) 

newStartDate("test"); 
false (OK) 

newStartDate("2013-02-02"); 
true (Bad) 

newStartDate("2.2.2013"); 
false (Bad) 

Результаты должны быть:

newStartDate("2013-02-02"); 
false 

newStartDate("2.2.2013)"; // or "2. 2. 2013" 
true 

У меня есть решение с пользовательской проверкой внутри функции расширения, но это не то, что я хочу. Я хочу иметь блок выше работы, он также короче.

+0

Откуда взялось правило валидации форматированных дат? Я не вижу его нигде в списке встроенных или пользовательских пользовательских правил в документах Knockout-Validation. – Limescale

+0

Я нашел его здесь, но я не уверен на 100%, если его в моей версии, https://github.com/neildonkin/Knockout-Validation/commit/25d132f1ec154118667d276c6c4a0dab5e94758b – user2711254

ответ

1

Единственное рабочее решение, которое у меня есть сейчас, приведено ниже. Проблема с этим валидатором заключается в том, что он также проверяет формат даты по умолчанию (EN) как действительный, поэтому мне нужно добавить IF, чтобы вернуть это как недопустимый формат даты.

 
var dateValidator = function (val) { 
      if (!val) 
       return false; 
      if (moment(val, 'DD.MM.YYYY HH:mm').isValid()) { 
       return true; 
      } 
      else 
       return false; 
     };

var startDate = ko.observable().extend({ validation: { validator: dateValidator, message: 'Start of task is not in correct format.' } });

+1

Вниз, это даже не с использованием правил проверки нокаута. Это может сработать, но это определенно не способ пойти с KOJS. –

11

Немного поздно почему не ... Правило даты кажется слишком разрешительным для моих целей. Если вам нравится момент, но хочется чего-то чистого для вызывающего абонента, добавить правило возражают validation.rules:

ko.validation.rules['simpleDate'] = { 
    validator: function (val, validate) { 
     return ko.validation.utils.isEmptyVal(val) || moment(val, 'MM/DD/YYYY').isValid(); 
    }, 
    message: 'Invalid date' 
}; 

И затем использовать его как:

var someDate= ko.observable().extend({ simpleDate: true }); 
+0

+1 для использования правил валидации и импульсов. –

+0

[vote up] Спасибо, я распространил ваш ответ с переданным форматом, чтобы его можно было повторно использовать в другом месте. – hofnarwillie

2

Очень поздно для этого, но просто хочу чтобы поделиться своими обновлениями с ответом @ ChoptimusPrime. Не жестко-кодирование в формате:

ko.validation.rules['dateAndFormat'] = { 
    validator: function (val, format) { 
     return ko.validation.utils.isEmptyVal(val) || moment(val, format).isValid(); 
    }, 
    message: 'Please provide a valid date.' 
}; 
ko.validation.registerExtenders();