2013-07-30 82 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 });