Javascript vuelidate中的可选嵌套验证

Javascript vuelidate中的可选嵌套验证,javascript,vue.js,vuelidate,Javascript,Vue.js,Vuelidate,在vuelidate中添加可选验证对象的正确方法是什么 给定以下验证形状: validations: { vehicles: { $each: { type: { required }, engine: { required: requiredIf((vehicle) => vehicle.type == 'car'),

在vuelidate中添加可选验证对象的正确方法是什么

给定以下验证形状:

validations: {
    vehicles: {
        $each: {
            type: {
                required
            },
            engine: {
                required: requiredIf((vehicle) => vehicle.type == 'car'),

                size: {
                    required
                },

                power: {
                    required
                }
            }
        }
    }
}

我的期望是,对于
自行车
类型的车辆,我不需要提供尺寸和功率,因为不需要它们的主
发动机
。但是,验证返回无效。

您可以做的不是要求引擎的每个子字段都是必需的,而是要求每个引擎同时具有
大小和
功率
,以便每次有引擎时都必须具有这些键。将此项与所需if一起添加,您将获得以下信息:
每辆车都必须有一种类型,如果它是一辆车,则需要一台发动机,并且每台发动机都必须有功率和尺寸

下面的代码片段显示了它的工作原理

Vue.use(vuelidate.default);
设{required,requiredIf,helpers}=验证器;
常量包含=(参数)=>
(值)=>!helpers.req(值)||
参数减少((累计,当前)=>累计和当前值,真);
var app=新的Vue({
el:“#应用程序”,
数据:()=>({
车辆:[
{
类型:'汽车',
发动机:{
尺码:5,
功率:2.5,
}
},
{
类型:'自行车',
}
]
}),
验证:{
车辆:{
每人$:{
类型:{required},
发动机:{
必填项:requiredIf((value)=>value.type=='car'),
包含:包含(['size','power']),
}
}
}
},
创建(){
console.log(此.$v.$invalid);
}
});

你可以做的不是要求引擎的每个子字段都是必需的,而是要求每个引擎都有
大小和
功率
,这样每当有引擎时,它都必须有这些键。将此项与所需if一起添加,您将获得以下信息:
每辆车都必须有一种类型,如果它是一辆车,则需要一台发动机,并且每台发动机都必须有功率和尺寸

下面的代码片段显示了它的工作原理

Vue.use(vuelidate.default);
设{required,requiredIf,helpers}=验证器;
常量包含=(参数)=>
(值)=>!helpers.req(值)||
参数减少((累计,当前)=>累计和当前值,真);
var app=新的Vue({
el:“#应用程序”,
数据:()=>({
车辆:[
{
类型:'汽车',
发动机:{
尺码:5,
功率:2.5,
}
},
{
类型:'自行车',
}
]
}),
验证:{
车辆:{
每人$:{
类型:{required},
发动机:{
必填项:requiredIf((value)=>value.type=='car'),
包含:包含(['size','power']),
}
}
}
},
创建(){
console.log(此.$v.$invalid);
}
});

我最近遇到了类似的情况,并使用“parentVm”解决了问题,如中所述

你应该试试这个:

...

engine: {
  required: requiredIf((parentVm) => {return parentVm.type === 'car'}),
  size: {between: between(yourMinValue, yourMaxValue)},
  power: {between: between(yourMinValue, yourMaxValue)},
} 
...

我最近经历了一个类似的情况,并使用“parentVm”解决了这个问题,如中所述

你应该试试这个:

...

engine: {
  required: requiredIf((parentVm) => {return parentVm.type === 'car'}),
  size: {between: between(yourMinValue, yourMaxValue)},
  power: {between: between(yourMinValue, yourMaxValue)},
} 
...

您可以包含更多的实现吗?或者至少你的模型是什么样子的?你能包含更多的实现吗?或者至少你的模型是什么样子的?我认为这个解决方案的缺点是它删除了
大小
功率
@tony19的验证规则。不,它没有。你所要做的就是添加它们,你唯一做不到的就是把它们放在需要的地方。我没有包括任何内容,因为OP没有。是的,它确实删除了这两个字段的规则。您可以在运行时查看
$v
,查看
size
power
没有规则来确认。这些规则将用于向用户显示错误。如果您尝试添加规则,您将遇到与原始问题相同的问题。@tony19因此,如果我添加一个
size:{minValue:minValue(0)}
,它将不起作用?这似乎起作用,因为如果缺少字段,它将正确地引发错误。我想在这种情况下,这可能是
required
的合适替代品。我认为应该将该规则添加到您的答案中,以便它涵盖问题中最初显示的功能。我认为该解决方案的缺点是它删除了
大小
功率
@tony19的验证规则。不,它没有。你所要做的就是添加它们,你唯一做不到的就是把它们放在需要的地方。我没有包括任何内容,因为OP没有。是的,它确实删除了这两个字段的规则。您可以在运行时查看
$v
,查看
size
power
没有规则来确认。这些规则将用于向用户显示错误。如果您尝试添加规则,您将遇到与原始问题相同的问题。@tony19因此,如果我添加一个
size:{minValue:minValue(0)}
,它将不起作用?这似乎起作用,因为如果缺少字段,它将正确地引发错误。我想在这种情况下,这可能是
required
的合适替代品。我认为应该将该规则添加到您的答案中,以便它涵盖问题中最初显示的功能。由于您的$v是一个集合,因此您必须使用以下内容验证每个项目:此处显示您的消息!由于您的$v是一个集合,因此您必须使用以下内容验证每个项目:此处显示您的消息!