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

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

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

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

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

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

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

Здесь пример того, как мой 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>

As displayed on my local machine

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Пример

YourViewmodelname.errors.showAllMessages(false);

Ответ 3

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

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

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

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

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