我不明白奇怪的敲除验证异步验证器行为。如果我在此验证器中使用其他observable,验证过程将变得无穷无尽。请看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 :(得分:1)
我怀疑在验证过程中更改模型值是个好主意。你永远不应该这样做,淘汰或不淘汰赛。 我不知道验证内部是如何工作的,但它可能使用与计算机相同的机制:评估您在函数中读取的哪些可观察量,只有在这些可观察量发生变化时才能调用验证器。这可以解释为什么当你不读条时你没有得到无限循环。 当你删除其他行时你没有得到无限循环的原因是因为值没有改变。
答案 1 :(得分:1)
KnockoutValidation订阅更改您扩展的observable上的事件,以便在值更改时运行验证方法。因为您在自己的验证方法中更改了observable的值,所以您将获得无限循环。
基本上,您无法为验证方法内部验证的事物分配值。