无休止的异步淘汰验证

时间:2013-07-05 03:43:55

标签: knockout.js knockout-validation

我不明白奇怪的敲除验证异步验证器行为。如果我在此验证器中使用其他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);

2 个答案:

答案 0 :(得分:1)

我怀疑在验证过程中更改模型值是个好主意。你永远不应该这样做,淘汰或不淘汰赛。 我不知道验证内部是如何工作的,但它可能使用与计算机相同的机制:评估您在函数中读取的哪些可观察量,只有在这些可观察量发生变化时才能调用验证器。这可以解释为什么当你不读条时你没有得到无限循环。 当你删除其他行时你没有得到无限循环的原因是因为值没有改变。

答案 1 :(得分:1)

KnockoutValidation订阅更改您扩展的observable上的事件,以便在值更改时运行验证方法。因为您在自己的验证方法中更改了observable的值,所以您将获得无限循环。

基本上,您无法为验证方法内部验证的事物分配值。