Дюрандаль с ko.validation.init

Итак, вот проблема, с которой я столкнулся в течение нескольких дней.

У меня есть приложение Durandal, и я хочу применить проверку ko к элементам управления. Теперь проверка применяется, но проблема в том, что она не вступает в силу при первой загрузке. Например, если у меня есть текстовое поле, для которого требуется установить значение true, и во время загрузки это текстовое поле пусто, KO не показывает требуемое сообщение.

Он показывает сообщение только в том случае, если я набираю что-то в текстовом поле, затем выхожу из текстового поля, снова захожу в текстовое поле, удаляю данные и затем снова выхожу из текстового поля.

Я даже пытался добавить ko.validation.init({messagesOnModified: false}) и параметр проверки в HTML внутри тега div.

Но никакого аффекта.

Ниже мой код

define(function (require) {
 ko.validation.init({
    messagesOnModified: false        
});
var duration = ko.observable().extend({
    required: { message: 'Please enter valid number.' }, number: true
});
var email = ko.observable().extend({ email: true, required: true });

var vm = {
    duration: duration,
    email: email

};
vm["errors"] = ko.validation.group(vm);
return vm;
});

HTML-код

            <span data-bind="text: errors().length"></span> Errors

            <div>
                <label for="txtDuration">Duration</label>
                <input name="txtDuration" type="text" data-bind="value: duration" />
                <span>(Min)</span>
            </div>
            <div>
                <label for="txtEmail">Email</label>
                <input name="txtEmail" type="text" data-bind="value: email" />
            </div>
            <input type="submit" value="Submit" data-bind="enable: isValid()">

    </form>

Please help.


person user1662008    schedule 11.06.2013    source источник
comment
Я также пробовал нокаут-проверку на Fiddle, и у нее такая же проблема. jsfiddle.net/sachinohri/U3QZU Это также имеет ту же проблему, что в нем не отображается требуемое сообщение о начальная загрузка текстового поля (по умолчанию текстовое поле пусто)   -  person user1662008    schedule 11.06.2013


Ответы (2)


Эта проблема в списке проблем проверки описывает поведение: https://github.com/Knockout-Contrib/Knockout-Validation/issues/211.

Предлагаемые обходные пути:

Используйте vm.name.isModified(true) или vm.name.valueHasMutated() для запуска обновления. http://jsfiddle.net/RainerAtSpirit/v6dek/6/

ko.validation.init({

    messagesOnModified: false
});

var vm = {
    name: ko.observable().extend({
        required: true
    })
};
vm.name.isModified(true) // or alternatively vm.name.valueHasMutated();
ko.applyBindings(vm);
person RainerAtSpirit    schedule 11.06.2013
comment
Спасибо. Это работает очень хорошо. После тестирования у меня возник еще один вопрос :) Если я не хочу показывать сообщение при загрузке экрана, но только тогда, когда пользователь переходит из текстового поля (текстовое поле потеряло фокус), и значение не меняется. Я надеюсь, что я имею какой-то смысл, позвольте мне привести пример. У меня есть текстовое поле с требуемым значением true, но в первый раз, когда оно загружается, текстовое поле пустое. Теперь, если пользователь переходит к этому текстовому полю (сосредотачивается на текстовом поле) и ничего не делает (не печатает, а просто вводит вкладки из текстового поля) выходит из текстового поля, тогда только я хотел бы показать сообщение. - person user1662008; 11.06.2013
comment
Не угоняйте свой собственный вопрос ;-). Изучите новый вопрос о stackoverlflow и списке проблем проверки и задайте новый вопрос, если вы не можете найти ответ. - person RainerAtSpirit; 11.06.2013

Вы должны использовать группу проверки и showAllMessages

http://jsfiddle.net/U3QZU/1/

this.errors = ko.validation.group(this);
this.errors.showAllMessages();
person Anders    schedule 11.06.2013