Javascript 如何使用敲除验证来验证特定的子项
我正在使用敲除验证,并添加了2个子集合,其中包含验证规则Javascript 如何使用敲除验证来验证特定的子项,javascript,knockout.js,knockout-validation,Javascript,Knockout.js,Knockout Validation,我正在使用敲除验证,并添加了2个子集合,其中包含验证规则 var Item = function(id, name) { var self = this; self.id = ko.observable(id).extend({required: {message: 'item id required'}}); self.name = ko.observable(name).extend( { minLength: {message :'item name must be
var Item = function(id, name) {
var self = this;
self.id = ko.observable(id).extend({required: {message: 'item id required'}});
self.name = ko.observable(name).extend(
{
minLength: {message :'item name must be at least 5 characters', params: 5},
maxLength: 10
});
ko.validation.group(self, { live: true });
};
var itemsList = [new Item(1, 'test'), new Item(2, 'item 2'), new Item(0, '1')];
var viewModel = {
items : ko.observableArray(itemsList),
items2: ko.observableArray(itemsList),
firstName: ko.observable().extend({minLength: 2, maxLength: 10}),
lastName: ko.observable().extend({required: true}),
emailAddress: ko.observable().extend({
// custom message
required: {
message: 'Please supply your email address.'
}
}),
age: ko.observable().extend({min: 1, max: 100}),
location: ko.observable()
};
使用
我的子集合正确显示验证消息,但我只希望验证一个子集合。用户表示要传入我想要验证的项目,如:
ko.validation.group([viewModel.firstName, viewModel.lastName, viewModel.items]);
但当我这样做时,子集合不再显示验证消息
要复制,请转到我上面链接的示例,然后单击提交。两个组中的项目0和项目2都将有验证消息。改变
viewModel.errors = ko.validation.group(viewModel, {deep: true});
到
再次运行并单击提交
创建ViewModel时:
var itemsList = [new Item(1, 'test'), new Item(2, 'item 2'), new Item(0, '1')];
var viewModel = {
items : ko.observableArray(itemsList),
items2: ko.observableArray(itemsList),
您在两个可观察数组中共享相同的可观察对象,即items
和items2
您可以通过添加新的观察值来解决它(我添加itemsList2
,然后使用它初始化items2
):
这里是一个示例,以及完整的ViewModel
var Item = function(id, name) {
var self = this;
self.id = ko.observable(id).extend({required: {message: 'item id required'}});
self.name = ko.observable(name).extend(
{
minLength: {message :'item name must be at least 5 characters', params: 5},
maxLength: 10
});
ko.validation.group(self, { live: true });
};
var itemsList = [new Item(1, 'test'), new Item(2, 'item 2'), new Item(0, '1')];
var itemsList2 = [new Item(1, 'test'), new Item(2, 'item 2'), new Item(0, '1')];
var viewModel = {
items : ko.observableArray(itemsList),
items2: ko.observableArray(itemsList2),
firstName: ko.observable().extend({minLength: 2, maxLength: 10}),
lastName: ko.observable().extend({required: true}),
emailAddress: ko.observable().extend({
// custom message
required: {
message: 'Please supply your email address.'
}
}),
age: ko.observable().extend({min: 1, max: 100}),
location: ko.observable()
};
你好如果我将
{deep:true}
添加为viewModel.errors=ko.validation.group([viewModel.lastName,viewModel.items],{deep:true})代码>我认为它显示了相同的错误。“我知道这是你想要的吗?”约瑟罗斯,你好。谢谢你的答复,但这不是我需要的。我认为我不能使用{deep:true},因为这会验证所有子集合,我只想验证其中的一个子集合。我加了一个截图。嗨。另一个问题。在您的代码中,您在两个数组中共享相同的观测值。如果将另一个itemsList 2
声明为:var itemsList=[新项目(1,'测试')、新项目(2,'项目2')、新项目(0,'1')];var itemsList2=[新项目(1,'测试')、新项目(2,'项目2')、新项目(0,'1')]
然后使用它们items:ko.observatarray(itemsList)
和items2:ko.observatarray(itemsList)
。另外,您还添加了{deep:true}
,然后它会按照您所说的那样工作,例如:。嘿。甚至没有考虑共享变量是问题。是的,那正是我想要的,谢谢。加上它作为答案,我会接受的。
var itemsList = [new Item(1, 'test'), new Item(2, 'item 2'), new Item(0, '1')];
var viewModel = {
items : ko.observableArray(itemsList),
items2: ko.observableArray(itemsList),
var itemsList = [new Item(1, 'test'), new Item(2, 'item 2'), new Item(0, '1')];
var itemsList2 = [new Item(1, 'test'), new Item(2, 'item 2'), new Item(0, '1')]; <---
var viewModel = {
items : ko.observableArray(itemsList),
items2: ko.observableArray(itemsList2), <---
...
};
viewModel.errors = ko.validation.group([viewModel.lastName, viewModel.items], {deep: true});
var Item = function(id, name) {
var self = this;
self.id = ko.observable(id).extend({required: {message: 'item id required'}});
self.name = ko.observable(name).extend(
{
minLength: {message :'item name must be at least 5 characters', params: 5},
maxLength: 10
});
ko.validation.group(self, { live: true });
};
var itemsList = [new Item(1, 'test'), new Item(2, 'item 2'), new Item(0, '1')];
var itemsList2 = [new Item(1, 'test'), new Item(2, 'item 2'), new Item(0, '1')];
var viewModel = {
items : ko.observableArray(itemsList),
items2: ko.observableArray(itemsList2),
firstName: ko.observable().extend({minLength: 2, maxLength: 10}),
lastName: ko.observable().extend({required: true}),
emailAddress: ko.observable().extend({
// custom message
required: {
message: 'Please supply your email address.'
}
}),
age: ko.observable().extend({min: 1, max: 100}),
location: ko.observable()
};