Валидация нокаута оценивается сразу при загрузке

Я использую MVC, Knockout и Knockout Validation для проверки моей модели представления.

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

Эта проблема особенно происходит с выпадающими (выберите) элементами управления.

Я предполагаю, что это проблема, которую я создал, каким-то образом непреднамеренно изменяя / получая доступ / изменяя наблюдаемое в другой части моего кода JavaScript. Однако я не знаю, как это отследить.

Есть ли способ, которым я могу как-то подписаться или отследить даже то, что срабатывает, что вызывает проверку в Knockout Validation? Мне просто нужно знать, почему это так стреляет. Я уверен, что значение функции isValid() постоянно ложно.

Вот пример того, как мой HTML настраивается при загрузке страницы, без каких-либо проблем:

<select class="highlightable validationElement" name="obsstate" data-bind="value: standardAnswers.ans106_1.value" required="true">
    <option value="">-- Select -- </option>
        <option value="AK">AK</option>
        <option value="AL">AL</option>
        etc...

</select>

Как отображается на моей локальной машине

3 ответа

Решение

Я понял эту проблему самостоятельно.

Проблема существует между механизмом бритвы, шаблонизирующим параметры выбора, и последующим связыванием значения выбранного элемента с Knockout.

Несмотря на то, что в поле выбора нет введенного пользователем значения, значение по умолчанию "--select--" фактически содержит значение. В моем случае это была пустая строка. Поэтому, когда я применил нокаутирующие привязки, мое свойство viewmodel было "обновлено" пустым строковым значением, и, следовательно, сработала проверка.

Чтобы обойти это в моем случае, я установил в качестве значения по умолчанию для моей модели пустую строку. Поэтому, когда применяются привязки, событие наблюдаемого события Knockout не генерируется событие valueHasMutated и, следовательно, не проверяется.

После наложения привязок на модель представления. Затем для этого viewmodel сделать showAllMessages как false

пример

YourViewmodelname.errors.showAllMessages(false);

Цитирование страницы KO.... ( http://knockoutjs.com/documentation/options-binding.html)

KO добавит к списку элементов префикс, который отображает текст "Выберите элемент…" и имеет значение undefined. Таким образом, если myChosenValue содержит значение undefined (что по умолчанию делают наблюдаемые), тогда будет выбран фиктивный параметр. Если параметр optionsCaption является наблюдаемой, то текст исходного элемента будет обновляться по мере изменения значения наблюдаемой.

Итак, я решил это, установив "undefined" при определении свойства, см. Пример ниже:

self.myProperty = ko.observable(undefined).extend({
    required :  {"Field Required"}
});

Надеюсь это поможет...

Другие вопросы по тегам