Knockout.js 敲除验证未按预期工作

Knockout.js 敲除验证未按预期工作,knockout.js,knockout-validation,Knockout.js,Knockout Validation,查看文档,我似乎应该使用validatedObservable如下所示: ko.validatedObservable({ id: id, name: ko.observable(name).extend({required: true}) }); 但是,ko.validatedObservable定义中的以下行导致错误: obsv.errors.subscribe(function (errors) { obsv.isValid(errors.length === 0

查看文档,我似乎应该使用
validatedObservable
如下所示:

ko.validatedObservable({ id: id, name: ko.observable(name).extend({required: true}) });
但是,
ko.validatedObservable
定义中的以下行导致错误:

    obsv.errors.subscribe(function (errors) {
        obsv.isValid(errors.length === 0);
    });
如果我把内部物体包裹在一个可观察的物体中,它就会工作

ko.validatedObservable(ko.observable({ id: id, name: ko.observable(name).extend({required: true}) }));

我无法在JSFIDLE上重现该错误,但以下是示例:。我正在使用敲除3.0和最新的敲除验证。有什么建议吗

我通过配置验证插件,将
observable
选项设置为
false
,可以重新设置异常。()

虽然文档中没有写入,但您需要设置
observable:true
(顺便说一下,这是默认设置),以便
ko.validatedObservable
正常工作:

因此,将您的配置更改为

ko.validation.init({
        grouping: {
            observable: true,
        }
    });
写入
ko.validatedObservable(ko.observable({id:id,name:ko.observable(name).extend({required:true}))
并没有解决这个问题,只是隐藏了它(在我看来,这种行为实际上是插件中的一个bug)

因为在你的例子中:

self.id = 1;
self.name = ko.observable("blah").extend({required: true});
self.myCheck = ko.validatedObservable(ko.observable({id: self.id, name: self.name)});

对名称的验证仍然有效,但您的
myCheck
将无效,因为它没有errors属性,因此
将始终为空。

谢谢!我将它添加到我的设置中:
ko.validation.init({grouping:{deep:true,observable:true})
现在似乎可以工作了,但是如果
observable:true
是默认值,为什么我需要设置它呢?如果您使用了
ko.validation.init({grouping:{deep:true})
因为您忽略了
可观察的
属性,所以将其隐式设置为
false