2013-07-05 107 views
1

我不明白奇怪的淘汰賽驗證異步驗證器行爲。如果我和這個驗證器中的其他可觀察元素一起工作,驗證過程變得無窮無盡。請看jsFiddle example。如果我刪除字符串4,5或8,它將正確工作。無盡的異步淘汰賽驗證

ko.validation.rules.asyncValidator = { 
    async: true, 
    validator: function (val, vm, callback) { 
     vm.bar(); 
     vm.bar(true); 
     setTimeout(function() { 
      console.log('validating ...'); 
      vm.bar(false); 
      callback(true); 
     }, 1000); 
    } 
}; 
ko.validation.registerExtenders(); 

vm = { 
    foo: ko.observable(), 
    bar: ko.observable() 
}; 
vm.foo.extend({asyncValidator: vm}); 

ko.applyBindings(vm); 
+0

小提琴並沒有真正顯示問題。 –

+0

爲什麼?你看到控制檯輸出了嗎? – imbolc

+0

我的不好。我現在看到它。對於那個很抱歉。 –

回答

1

我懷疑在驗證過程中更改模型值是個好主意。你永遠不應該這樣做,淘汰賽或不淘汰賽。 我不知道驗證如何在內部工作,但它可能使用與計算相同的機制:評估您在函數中讀取哪些可觀察項,以便只有在這些可觀察項發生更改時才能調用驗證程序。這可以解釋爲什麼當你不讀條時你沒有得到一個無限循環。 而你刪除其他行時沒有得到死循環的原因是因爲該值不會改變。

1

KnockoutValidation訂閱更改您擴展的observables上的事件,以便在值更改時運行驗證方法。因爲你正在改變它自己的驗證方法中的observable的值,所以你會得到一個無限循環。

基本上,您不能爲驗證方法內部驗證的內容分配值。