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

Условная проверка не работает для анонимного правила проверки нокаута

У меня есть следующие атрибуты в моей модели viewmodel, которые используют проверку нокаута, одна из них - это выборочная проверка, чтобы проверить соответствие пароля.

model.Password = ko.observable()
                  .extend({ required: { message: "Password is required.", 
                        params: true,
                        onlyIf: function () { return model.IsCredentialsRequired(); }}
                    });


model.ConfirmPassword = ko.observable().
                        extend({ validation: { validator: mustEqual,
                        message: 'Passwords do not match.',
                        params: model.Password,               
                        onlyIf: function () { return model.IsCredentialsRequired(); } }
                    });

код для пользовательской функции проверки

var mustEqual = function (val, other) {
                return val == other();
            };

Я обнаружил, что условие OnlyIf отлично работает для model.Password в зависимости от model.IsCredentialsRequired(), но не работает для model.ConfirmPassword. Может ли кто-нибудь помочь мне, почему это происходит? Есть ли другой способ, с помощью которого я могу использовать условная проверка для пользовательских правил?

Заранее спасибо

4b9b3361

Ответ 1

нокаут-валидация в настоящее время не поддерживает "onlyIf" для анонимных правил. Но он поддерживается для пользовательских правил. Поэтому вы можете создать собственное правило и использовать onlyIf с этим:

ko.validation.rules['confirmPasswordMatches'] = {
    validator: function (val, params) {
        var otherValue = params;
        return val === ko.validation.utils.getValue(otherValue);
    },
    message: 'Passwords do not match.',
};
ko.validation.registerExtenders();

function ViewModel() {
    var self = this;

    self.IsCredentialsRequired = ko.observable(true);

    self.Password = ko.observable()
        .extend({
            required: {
                message: "Password is required.",
                params: true,
                onlyIf: self.IsCredentialsRequired
            }
    });

    self.ConfirmPassword = ko.observable().
    extend({
            confirmPasswordMatches: {
            params: self.Password,
            onlyIf: self.IsCredentialsRequired
        }
    });

}

Fiddle: http://jsfiddle.net/delixfe/mFAEx/