Подтвердить что ты не робот

Вручную получить нокаут, чтобы переоценить зависимость

Я не уверен, что это возможно, но у меня есть сценарий, в котором у меня есть система проверки, которая уведомляет мою систему проверки, когда что-то стало действительным/недействительным с помощью зависимого наблюдаемого. Теперь это отлично работает, когда пользователь заполняет форму, так как dependantObservable отключается от изменения базового наблюдаемого значения. (т.е. если свойство Name изменяется, оно будет переоценивать зависимое от наблюдателя значение isValid, которое, в свою очередь, будет уведомлять мою привязку, которая перехватывает систему проверки).

Теперь моя проблема заключается в том, что если пользователь вообще не касается формы и просто переходит к представлению, это не вызовет привязки, поскольку базовые значения не изменились для каких-либо наблюдаемых, поэтому ни один из подписчиков не узнает о любые изменения валидации происходят. В идеале я не хочу проходить через каждый наблюдаемый и повторно назначать ему свою текущую переменную, чтобы подтолкнуть оценку валидации, что, в свою очередь, вызовет изменение состояния проверки. Так как действительно все, что я хочу сделать, это получить isValid dependantObservable для обновления из-за отсутствия лучшего слова.

Кажется, это довольно неприятно, но мои варианты, похоже, тоже:

1) Принудительное изменение значения для всех наблюдаемых проверяемых (ужасных) 2) Внесите повторную оценку зависимой функции isValidObservable для запуска абонента (менее ужасного, но все же плохого) 3) Перезапишите библиотеку валидации, чтобы выставить функцию forceValidation(), которая каким-то образом вызовет все, что нужно переоценить, минуя необходимость того, чтобы базовые наблюдаемые вызывали конвейер проверки.

Любые идеи?

4b9b3361

Ответ 1

На вашем вычисленном наблюдаемом (isValid) вы можете вызвать notifySubscribers(currentValue), который будет уведомлять всех подписчиков с текущим значением. Он не будет переоценивать вычисляемые и будет просто уведомлять подписчиков с текущим значением.

Ответ 2

Добавьте привязку enable: formValid, где formValid = ko.computed(return true if all values are valid), чтобы отправить кнопку. Таким образом, пользователь не может подчиняться, пока форма не будет заполнена должным образом.

Используйте ko.validation.validateObservable(yourDependentObservable) для повторного проверки поля вручную

или используйте yourObsevable.notifySubscribers(), если yourDependentObservable зависит от yourObservable.