Использование средства выбора даты с нокаутом и каркасом проверки нокаута

Я использую дату https://eonasdan.github.io/bootstrap-datetimepicker/. средство выбора с нокаутом и с использованием проверки ISODate структуры проверки нокаута.

Что я обнаружил с помощью средства выбора даты, так это то, что если с клавиатуры вводится недопустимая дата (keepInvalid: true), средство выбора вызывает событие dp.error. Если я затем исправлю дату с помощью клавиатуры, средство выбора не вызовет событие dp.change. Является ли это ожидаемым и правильным поведением сборщика? Если да, то есть ли обходной путь, который я могу использовать для решения проблем моих пользователей, как описано ниже?

При использовании средства выбора даты проверка ISODate никогда не срабатывает. Но я хочу, чтобы средство выбора НЕ исправляло автоматически то, что пользователь вводит в текстовое поле. Вместо этого мне нужно, чтобы базовый наблюдаемый объект был обновлен с помощью недопустимой записи, а затем позволил сработать проверке нокаута, которая обновит пользовательский интерфейс с состоянием проверки ошибки.

Я получаю жалобы на автоматическое исправление неверных дат, введенных с клавиатуры, потому что нет уведомления о том, что значение даты было изменено молча.

Поэтому я использую сборщик с опцией keepInvalid: true. Обработчик привязки обновляет наблюдаемое в событии dp.change. Я обновил предлагаемый обработчик привязки, чтобы также обновить наблюдаемое в событии dp.error.

Это почти делает то, что мне нужно. Но когда я делаю следующее:

  1. Выберите сегодняшнюю дату с помощью средства выбора, в результате чего в текстовое поле будет помещено «2016-04-22» (и наблюдаемое).
  2. Используйте клавиатуру, чтобы вставить недопустимый символ, чтобы у нас было «2016-0a4-22» в текстовом поле (и наблюдаемое). Срабатывает проверка нокаута, что является желаемым поведением.
  3. Теперь исправьте дату с помощью клавиатуры, удалив недопустимый символ и вернув текстовое поле на «2016-04-22». Подтверждение нокаута не очищается. Это связано с тем, что событие dp.change не запускается, когда текстовое поле обновляется для удаления неправильного значения. На данный момент в текстовом поле указано «2016-04-22», но базовая наблюдаемая по-прежнему имеет недопустимое значение «2016-0a4-22».

Если бы я исправил дату, используя средство выбора, а не клавиатуру, тогда событие dp.change запускается, и состояние ошибки проверки исчезает. Но не в том случае, если я буду исправлять вещи с помощью клавиатуры.


person David Hanlon    schedule 22.04.2016    source источник
comment
Эй. Добро пожаловать в (спрашиваем) Stack Overflow. Ваш пост имеет большой смысл, но я настоятельно рекомендую вам отредактировать его и добавить минимально воспроизводимый пример и объяснить, что добавление/изменение, к которому вы стремитесь и/или пытались. Было бы также полезно, если бы вы резюмировали с конкретным вопросом.   -  person Jeroen    schedule 23.04.2016
comment
Кажется, вам нужна пользовательская привязка, которая будет применять событие размытия, которое повторно применит значение к valueAccessor. Я только что помог с подобным сценарием, возможно, это поможет вам каким-либо образом. " title="Проверка нокаута не срабатывает с пользовательской привязкой нокаута"> stackoverflow.com/questions/36747210/   -  person kasperoo    schedule 24.04.2016
comment
Я попытался перехватить событие «изменение» в текстовом поле в обработчике привязки, но это событие никогда не срабатывает. Я предполагаю, что его съедает средство выбора даты. Я попробую этот подход снова, используя «размытие». Спасибо   -  person David Hanlon    schedule 25.04.2016