Настройте Knockout ViewModel для проверки

Я пытаюсь понять, как использовать плагин проверки Knockoutjs. На сайте проекта на github есть раздел начало работы, описывающий, как настроить модель представления с проверкой. В этом примере ViewModel объявлен как встроенный объект (правильная ли это терминология?) примерно так:

var myViewModel = ko.validatedObservable({
   property1: ko.observable().extend({ required: true }),
   property2: ko.observable().extend({ max: 10 })
});

console.log(myViewModel.isValid()); //false

myViewModel().property1('something');
myViewModel().property2(9);

console.log(myViewModel.isValid()); //true

Однако я хотел бы настроить свою модель представления с помощью такой функции:

function MyViewModel() {
    var self = this;
    self.property1 = ko.observable().extend({ required: true });
    self.property2 = ko.observable().extend({ max: 10 });
};

var viewModelInstance = new MyViewModel();
console.log(viewModelInstance.isValid()); //false

viewModelInstance.property1('something');
viewModelInstance.property2(9);

console.log(viewModelInstance.isValid()); //true

Проблема в том, что я получаю сообщение об ошибке сценария о том, что мой объект viewModelInstance не имеет метода isValid.


person Matthew Dresser    schedule 30.07.2013    source источник
comment
Используя ko.validatedObservable, вы сразу добавляете уровень функциональности проверки к объекту (так же, как kojs выполняет корректировки геттера/настройки/отображения, когда вы используете var foo = ko.observable('bar') вместо var foo = 'bar';). Чтобы пропустить это, будет удалена фактическая реализация, оставив вам (по сути) только метаданные без реализации. как насчет имитации того, что на самом деле выполняется< /а>?   -  person Brad Christie    schedule 30.07.2013


Ответы (2)


ko.validatedObservable() — это ключ к проверке модели представления. Он создает все внутренние методы, необходимые плагину (их больше, чем isValid). Вы по-прежнему можете создавать экземпляры с функцией, но попробуйте обернуть их в ko.validatedObservable() :

var viewModelInstance = ko.validatedObservable( new MyViewModel() );
person Wojciech Czerniak    schedule 30.07.2013

Это определение из исходного кода и единственное место, где оно используется в исходном коде knockout.validation.js.

validatedObservable() это и только это.

ko.validatedObservable = function (initialValue)
{
    if (!kv.utils.isObject(initialValue)) { return ko.observable(initialValue).extend({ validatable: true }); }

    var obsv = ko.observable(initialValue);
    obsv.errors = kv.group(initialValue);
    obsv.isValid = ko.observable(initialValue.isValid());   
    obsv.errors.subscribe(function (errors) {
        obsv.isValid(errors.length === 0);
    });
    debugger;

    return obsv;
};

По моему опыту, это больше проблем, чем того стоит - например, у него нет возможности указать «глубокий» для созданной «группы», и я думаю, что он действительно предназначен только для простых «одноуровневых» объекты js.

если у вас сложная модель, вам лучше просто сделать что-то подобное и создать массив объектов, которые вы действительно хотите проверить:

    var validatables = [];

    // if credit card is payment then validate payment details + address
    if (this.paymentMethod() == "Credit Card")
    {
        validatables.push(this.paymentDetails);
        validatables.push(this.billingAddress);

        if (this.shipToBillingAddress() == false)
        {
            validatables.push(this.shippingAddress);
        }
    }

    var group = ko.validation.group(validatables, { deep: true });
person Simon_Weaver    schedule 16.06.2014