2015-02-06 55 views
2

由于性能原因,我在项目上将ko.validation更新为2.0.2,现在所有错误都显示在applyBindings上。Kockoutjs验证会触发盲目的错误消息

例子

前: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()); 

什么是happenning任何想法?

回答

4

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

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

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

,因为当他们被宣布ko.computed s的第一评估和self.errors.showAllMessages()通话显示了您将错误信息查看应用绑定时的所有错误。

要解决这个问题,你需要设置你的计算的deferEvaluation延迟初评:

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

演示JSFiddle

或者你可以拨打self.errors.showAllMessages()直接在save没有使用计算:

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

演示JSFiddle