设置Knockout ViewModel进行验证

时间:2013-07-30 19:26:30

标签: knockout.js knockout-validation

我试图找出如何使用knockoutjs验证插件。查看github上的项目站点,有一个getting started section描述了如何使用验证设置视图模型。在这个例子中,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

但是,我想使用如下函数设置我的viewmodel:

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

2 个答案:

答案 0 :(得分:3)

ko.validatedObservable()是验证viewModel的关键。它创建了插件所需的所有内部方法(不仅仅是isValid)。您仍然可以使用函数创建实例,但尝试将其包装在ko.validatedObservable()中:

var viewModelInstance = ko.validatedObservable( new MyViewModel() );

答案 1 :(得分:1)

这是源代码中的定义,也是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 });