2013-07-30 55 views
4

我试图弄清楚如何使用knockoutjs验证插件。在github上查看项目站点,有一个getting started section描述如何通过验证来设置视图模型。在这个例子中,视图模型被声明为内联对象(这是正确的术语?)像这样:设置Knockout 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

+0

使用'ko.validatedObservable'你加入(同样的,当你在'var foo ='bar'上使用'var foo = ko.observable('bar')'时,kojs使得getter/setting /显示调整成为可能。 ')。跳过这将删除实际的实现离开你(本质上)只是元数据没有实现。怎么样模仿实际上[正在执行](https://github.com/ericmbarnard/Knockout-Validation/blob/master/Src/knockout.validation.js#L1082-L1096)? –

回答

3

ko.validatedObservable()是验证viewModel的关键。它创建插件所需的所有内部方法(不止isValid)。你还可以创建功能情况,但尝试ko.validatedObservable()包装它:

var viewModelInstance = ko.validatedObservable(new MyViewModel()); 
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 });