2

我找不到任何解决方案,所以这是我的问题:

我已经为一个小表单设置了验证,您可以在其中将项目添加到集合中(observableArray,稍后实际保存到 DB)。

第一个项目的验证工作正常,验证消息显示,但第二次验证消息不会显示(验证本身有效,您不能添加项目)。

这就是我所做的:

  1. 例如在 newSchool 对象中设置验证

    self.City = ko.observable(item ? item.City : '').extend(
    {
        required: true
    });
    
  2. 在 MainViewModel 中构建验证组

    self.schoolErrors = ko.validation.group({ schools: self.newSchool }, { deep: true });

  3. 在 MainViewModel 中:检查错误,否则推送到集合中,使用新的默认值初始化 newSchool 可观察对象

    self.addSchool = function () {
        if (self.schoolErrors().length > 0) {
            self.schoolErrors.showAllMessages();
            return;
        }
        self.schools.push(self.newSchool());
        self.newSchool(new School());
        self.newSchool().load();
        self.schoolErrors = ko.validation.group({ schools: self.newSchool }, { deep: true  }); };
    

出于调试原因,我打印出学校对象中已验证可观察值的 isValid 和 isModified 值。这些似乎很好。在我插入第一项后, isValid 和 isModified 都返回为false

唯一的问题,如前所述,不再显示验证消息。

对我来说也很奇怪:我不使用自定义验证消息模板,除非在一种情况下,我需要针对计算字段进行验证。这会出现,但“内置”验证消息不会。

任何想法?

4

2 回答 2

2

如果只是向敲除验证添加了一个拉取请求,它修复了敲除验证组对可观察数组中的更改没有反应的问题。

https://github.com/Knockout-Contrib/Knockout-Validation/pull/223

于 2013-02-08T20:13:29.970 回答
0

遗憾的是,当插入新项目时,该组没有得到重新评估。订阅数组并明确执行。

this.items.subscribe(function() {
     this.errors = ko.validation.group(this);
     this.errors.showAllMessages();
}, this);

http://jsfiddle.net/fYrbt/

在小提琴中,我使用 Github 作为 CDN,所以如果小提琴不起作用,请等待并重新加载。

于 2013-02-06T13:29:16.000 回答