2015-02-06 33 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