Knockout validation - Группа проверки не запускается для разных обновлений ошибок?

Я пытаюсь настроить группу проверки для отображения ошибок после нажатия кнопки.

Моя проблема заключается в том, что я не могу заставить группу проверки корректно обновляться каждый раз, когда изменяется ошибка проверки.

В моем примере я вижу, что свойство .errors наблюдаемого поля корректно обновляется каждый раз, когда я покидаю текстовое поле (предназначенное). Для группы проверки документация указывает на вызов .showAllMessages() или оценку самой группы.

Я создал пример ниже. Краткое изложение поведения, которое я вижу:

  • При загрузке отображается сообщение о необходимости проверки (хорошо)
  • Всякий раз, когда ошибка проверки изменяется в поле, группа проверки не обновляется (grrrr)
  • Как только поле станет полностью действительным, группа проверки будет обновлена ​​(хорошо)
  • Как только поле становится недействительным после того, как оно стало действительным, оно будет обновлено первым сообщением проверки, но не будет обновляться должным образом, как указано выше.

В примере я настроил эти проверки для одного поля:

  • требуется
  • минДлина: 3
  • максимальная длина: 10
  • числовой

Вид:

<label>Test number</label>
    <input type="text" data-bind="value: myNumber"/>
    <div>myNumber error: <span data-bind="text: myNumber.errors"/></div>

<div>Validation group: 
    <ul data-bind="foreach: validationGroup"><li data-bind="text: $data"></li></ul>
</div>

<button type="submit" class="btn" data-bind="click: testValidate">Update validation group</button>

Модель представления:

var viewModel = {
        myNumber: ko.observable().extend({
                    maxLength: 10,
                    number: {
                        message: "Please ensure that myNumber contains only numeric characters"
                    },
                    required: {
                        message: "myNumber is required"
                    },
                    minLength: 3
                })
            };

viewModel.validationGroup = ko.validation.group([viewModel.myNumber]);

viewModel.testValidate = function () {
                            // Try both, to be sure...
                viewModel.validationGroup.showAllMessages();

                viewModel.validationGroup();
            };

person Overflew    schedule 08.10.2013    source источник
comment
stackoverflow.com/questions/8996449/knockout-validation   -  person jittakal    schedule 08.10.2013


Ответы (2)


Я попал и промахнулся с проверкой ko. Лучше всего он работает на простых страницах с простыми моделями. Я обнаружил, что мне нужно добавить такие параметры проверки:

var validationOptions = {
    decorateElement: true,
    registerExtenders: true,
    messagesOnModified: true,
    insertMessages: false,
    parseInputAttributes: true,
    messageTemplate: null,
    grouping: {
        deep: true
    },
};

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

ko.applyBindingsWithValidation(self, $id, validationOptions);

Дай мне знать, если это работает.

person segFault    schedule 08.10.2013

Что ж, похоже, это баг старой версии Knockout (v1.0.1).

Последняя выпущенная версия — v1.0.2 (от сентября 2012 г.), а приведенный ниже рабочий пример взят из последней версии GitHub: (последнее изменение — октябрь 2013 г.)

Вот JS Fiddle с тем же кодом выше, работающий по назначению: http://jsfiddle.net/overflew/JhWZq/1/

Таким образом, .showAllMessages() — это все, что требуется для обновления группы:

viewModel.testValidate = function () {
    viewModel.validationGroup.showAllMessages();
};

Причина прекращения использования старой версии: Проверка KO через NuGet (управление пакетами Microsoft .NET). инструмент) последний раз обновлялся в июне 2013 года с версией 1.0.1, которая теперь отстает на 1 или 2 версии.

person Overflew    schedule 09.10.2013