Использование Knockout Validation, когда правила проверки неизвестны до времени выполнения

У меня есть приложение KnockoutJS, которое требует, чтобы пользователь ввел свой физический адрес. По умолчанию мы предоставляем поля, которые сопоставляются с компонентами адреса в стране, в которой мы в основном работаем, в частности, нам требуются город США, штат и почтовый индекс. Эти поля, наряду с полем «Адрес», обязательны для заполнения. Это типичная формулировка адреса в США.

Но у нас также есть флажок, который позволяет им ввести адрес для любой страны. Если они отметят этот флажок, мы избавимся от полей города, штата и почтового индекса и заменим эти поля полем «Страна». Таким образом, у них есть поля «Адрес» и «Страна», которые являются обязательными. Город, штат и почтовый индекс скрыты и не требуются.

Я не могу понять, как настроить проверку для этого. По сути, мы не знаем, какое из полей потребуется, пока во время выполнения пользователь не укажет, имеет ли он адрес в США или за его пределами.

Как это сделать с помощью проверки на отключение?


person Josh    schedule 28.05.2013    source источник


Ответы (1)


Что может помочь, так это конструкция onlyIf для правил проверки. Например, почтовые индексы не требуются в Ирландии, поэтому у вас может быть такая ViewModel:

var viewModel = {
    availableCountries : ko.observableArray(["United States", "Canada", "Ireland"]),
    country : ko.observable("United States")
};

viewModel.zip = ko.observable("").extend({ required: { onlyIf: function() { return viewModel.country() !== "Ireland"; }  }});
viewModel.errors = ko.validation.group(viewModel);

В этом случае любой input, привязанный к наблюдаемому zip, потребуется только для США и Канады, но не для Ирландии. См. эту скрипту для демонстрации вышеизложенного.

person Jeroen    schedule 28.05.2013
comment
Спасибо, это сделало то, что мне было нужно. Я не смог найти никакой документации по параметру onlyIf, поэтому добавил вики-страницу. Если у вас есть минутка, чтобы просмотреть его и обновить, я уверен, что многие пользователи проверки KO будут благодарны, включая меня! :-) github.com/Knockout-Contrib/Knockout-Validation/wiki / - person Josh; 04.06.2013