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.
出于性能原因,我将项目的 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.