敲除验证内部可观察验证未触发
knockout validation inner observable validation is not triggred
我有以下 JS
对象:
var form= function () {
var self = this;
self.Name = ko.observable().extend({
required: {
message: 'Name is required.'
}
});
self.Manager = ko.observable().extend({
required: {
message: 'Manager is required.'
}
});
self.Email = ko.observable().extend({
required: {
message: 'Email is required.'
},
email: {
message: 'Entered Email is not valid.'
}
});
self.Players = ko.observableArray([]);
}
上述 JS
对象中的 Players
数组使用以下 JS
对象使用 new Player()
语法填充:
var Player = function () {
var self = this;
self.FirstName= ko.observable().extend({
required: {
message: 'Player First Nameis required.'
}
});
self.LastName= ko.observable().extend({
required: {
message: 'Player Last Name is required.'
}
});
}
并且我对 knockout-validation
库使用了以下设置:
ko.validation.init({
registerExtenders: true,
messagesOnModified: true,
insertMessages: false,
parseInputAttributes: true,
messageTemplate: null,
decorateInputElement: true,
errorElementClass: 'error',
grouping: {
deep: true,
observable: true
}
}, true);
我正在使用 viewModel.errors.showAllMessages()
来显示视图模型中的所有错误消息。我面临的问题是 player
对象的验证没有被触发,因为它存在于 Form
对象中。我什至将 deep
属性 设置为 true
但即使那样也不起作用,可能是什么问题?
简短的回答是您需要使用 { live: true } 来跟踪添加到可观察数组的对象的错误。
更长的答案:
我使用 Jeroen 的 fiddle 作为起点,并假设您想要的是显示所有玩家的所有可验证观察值的错误消息。
使用ko.validation.group(vm, options) 获取错误列表。它是公开 showAllMessages 函数的返回对象(返回错误数组的计算可观察对象)。
默认情况下,它不会对提供的视图模型执行深度遍历,因此您只会收到 Name、Manager 和 Email 属性的错误(正如我假设您当前收到的那样)。
要使其使用深度遍历,您可以提供 { deep: true } 选项。对于调用 group 函数时数组中的所有玩家,这应该会给您带来错误。
如果你希望它在调用 group 函数后也跟踪添加到可观察数组(在你的例子中是玩家)的对象,你可以使用 { live: true } 选项。它将在数组上创建订阅并在每次修改数组时更新错误列表。这是添加它的问题:https://github.com/Knockout-Contrib/Knockout-Validation/pull/223
下面是相关的片段,这里是 fiddle:
https://jsfiddle.net/2a7t72be/1/
var form = function () {
var self = this;
self.showErrors = function(){
self.errors.showAllMessages();
};
// ...
self.Players = ko.observableArray([]);
self.errors = ko.validation.group(self, { deep: true, live: true });
}
PS。您当然可以在调用 validation.init 时配置分组选项(只需在调用 group 之前配置)。
我有以下 JS
对象:
var form= function () {
var self = this;
self.Name = ko.observable().extend({
required: {
message: 'Name is required.'
}
});
self.Manager = ko.observable().extend({
required: {
message: 'Manager is required.'
}
});
self.Email = ko.observable().extend({
required: {
message: 'Email is required.'
},
email: {
message: 'Entered Email is not valid.'
}
});
self.Players = ko.observableArray([]);
}
上述 JS
对象中的 Players
数组使用以下 JS
对象使用 new Player()
语法填充:
var Player = function () {
var self = this;
self.FirstName= ko.observable().extend({
required: {
message: 'Player First Nameis required.'
}
});
self.LastName= ko.observable().extend({
required: {
message: 'Player Last Name is required.'
}
});
}
并且我对 knockout-validation
库使用了以下设置:
ko.validation.init({
registerExtenders: true,
messagesOnModified: true,
insertMessages: false,
parseInputAttributes: true,
messageTemplate: null,
decorateInputElement: true,
errorElementClass: 'error',
grouping: {
deep: true,
observable: true
}
}, true);
我正在使用 viewModel.errors.showAllMessages()
来显示视图模型中的所有错误消息。我面临的问题是 player
对象的验证没有被触发,因为它存在于 Form
对象中。我什至将 deep
属性 设置为 true
但即使那样也不起作用,可能是什么问题?
简短的回答是您需要使用 { live: true } 来跟踪添加到可观察数组的对象的错误。
更长的答案:
我使用 Jeroen 的 fiddle 作为起点,并假设您想要的是显示所有玩家的所有可验证观察值的错误消息。
使用ko.validation.group(vm, options) 获取错误列表。它是公开 showAllMessages 函数的返回对象(返回错误数组的计算可观察对象)。
默认情况下,它不会对提供的视图模型执行深度遍历,因此您只会收到 Name、Manager 和 Email 属性的错误(正如我假设您当前收到的那样)。
要使其使用深度遍历,您可以提供 { deep: true } 选项。对于调用 group 函数时数组中的所有玩家,这应该会给您带来错误。
如果你希望它在调用 group 函数后也跟踪添加到可观察数组(在你的例子中是玩家)的对象,你可以使用 { live: true } 选项。它将在数组上创建订阅并在每次修改数组时更新错误列表。这是添加它的问题:https://github.com/Knockout-Contrib/Knockout-Validation/pull/223
下面是相关的片段,这里是 fiddle: https://jsfiddle.net/2a7t72be/1/
var form = function () {
var self = this;
self.showErrors = function(){
self.errors.showAllMessages();
};
// ...
self.Players = ko.observableArray([]);
self.errors = ko.validation.group(self, { deep: true, live: true });
}
PS。您当然可以在调用 validation.init 时配置分组选项(只需在调用 group 之前配置)。