1

我不明白奇怪的淘汰赛验证异步验证器行为。如果我在此验证器中与其他可观察对象一起工作,验证过程将变得无止境。请看jsFiddle 示例。如果我删除字符串 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);
4

2 回答 2

1

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

基本上,您不能为您在验证方法中验证的事物分配值。

于 2015-02-06T11:07:41.620 回答
1

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

于 2013-07-05T06:03:16.913 回答