Kockoutjs Validation 在 blind 上触发错误消息

Kockoutjs Validation triggers errors messages on blind

出于性能原因,我将项目的 ko.validation 更新为 2.0.2,现在所有错误都显示在 applyBindings 上。

例子

之前: http://jsfiddle.net/rubenslopes/KHFn8/5392/

之后: http://jsfiddle.net/rubenslopes/e67ho5m5/

 ko.validation.init({
     parseInputAttributes: true,
     insertMessages: true,
     grouping: {
         deep: true,
         observable: false
     }
 });


 var viewModel = function () {
     var self = this;

     self.name = ko.observable();
     self.saveLabel = ko.observable('Save');

     self.errors = ko.validation.group(self);
     self.isValid = ko.computed(function () {
         return self.errors().length === 0;
     }, self);
     self.showAllMessages = ko.computed(function () {
         return self.errors.showAllMessages();
     }, self);

     self.save = function () {
         if (self.isValid()) self.saveLabel('Saved!');
         else self.showAllMessages();
     };
 };
 ko.applyBindings(new viewModel());

对正在发生的事情有什么想法吗?

您的两个示例并不完全相同....如果您在新代码中使用旧的验证插件:http://jsfiddle.net/ex9zLfde/它最初也会显示验证消息。

所以问题不在于插件版本,而在于你的 showAllMessages 计算中的实际代码:

self.showAllMessages = ko.computed(function () {
     return self.errors.showAllMessages();
 }, self);

因为 ko.computed 是在声明它们时首先计算的,并且 self.errors.showAllMessages() 调用会显示错误消息,您将在应用绑定时看到所有错误。

要解决此问题,您需要在计算机上设置 deferEvaluation 以延迟初始评估:

 self.showAllMessages = ko.computed(function () {
     return self.errors.showAllMessages();
 }, self, {deferEvaluation : true});

演示 JSFiddle.

或者您可以直接在 save 中调用 self.errors.showAllMessages() 而无需使用计算:

 self.save = function () {
     if (self.isValid()) self.saveLabel('Saved!');
     else self.errors.showAllMessages();
 };

演示 JSFiddle.