Javascript 如何使用敲除验证来验证特定的子项

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

我正在使用敲除验证,并添加了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 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()
};