Я использую дату https://eonasdan.github.io/bootstrap-datetimepicker/. средство выбора с нокаутом и с использованием проверки ISODate структуры проверки нокаута.
Что я обнаружил с помощью средства выбора даты, так это то, что если с клавиатуры вводится недопустимая дата (keepInvalid: true), средство выбора вызывает событие dp.error. Если я затем исправлю дату с помощью клавиатуры, средство выбора не вызовет событие dp.change. Является ли это ожидаемым и правильным поведением сборщика? Если да, то есть ли обходной путь, который я могу использовать для решения проблем моих пользователей, как описано ниже?
При использовании средства выбора даты проверка ISODate никогда не срабатывает. Но я хочу, чтобы средство выбора НЕ исправляло автоматически то, что пользователь вводит в текстовое поле. Вместо этого мне нужно, чтобы базовый наблюдаемый объект был обновлен с помощью недопустимой записи, а затем позволил сработать проверке нокаута, которая обновит пользовательский интерфейс с состоянием проверки ошибки.
Я получаю жалобы на автоматическое исправление неверных дат, введенных с клавиатуры, потому что нет уведомления о том, что значение даты было изменено молча.
Поэтому я использую сборщик с опцией keepInvalid: true. Обработчик привязки обновляет наблюдаемое в событии dp.change. Я обновил предлагаемый обработчик привязки, чтобы также обновить наблюдаемое в событии dp.error.
Это почти делает то, что мне нужно. Но когда я делаю следующее:
- Выберите сегодняшнюю дату с помощью средства выбора, в результате чего в текстовое поле будет помещено «2016-04-22» (и наблюдаемое).
- Используйте клавиатуру, чтобы вставить недопустимый символ, чтобы у нас было «2016-0a4-22» в текстовом поле (и наблюдаемое). Срабатывает проверка нокаута, что является желаемым поведением.
- Теперь исправьте дату с помощью клавиатуры, удалив недопустимый символ и вернув текстовое поле на «2016-04-22». Подтверждение нокаута не очищается. Это связано с тем, что событие dp.change не запускается, когда текстовое поле обновляется для удаления неправильного значения. На данный момент в текстовом поле указано «2016-04-22», но базовая наблюдаемая по-прежнему имеет недопустимое значение «2016-0a4-22».
Если бы я исправил дату, используя средство выбора, а не клавиатуру, тогда событие dp.change запускается, и состояние ошибки проверки исчезает. Но не в том случае, если я буду исправлять вещи с помощью клавиатуры.