使用 vee-validate 验证 select 单选按钮交换列表不显示验证消息
Use vee-validate to validate select list with radio button exchange not show up validate message
我有一个使用无线电交换 select 列表的表单,但验证消息似乎无法正常工作。
这是我的表单,TypeA 验证消息确实有效:
但是当我将单选按钮更改为 TypeB 时,验证消息不起作用:
而且如果我点击提交按钮并且如果 TypeA 验证不正确并且我更改为 TypeB 提交它,验证将不会通过,因为它看起来像 vee-validate 只验证了 TypeA...
这是我的代码:
<form id="form" @submit.prevent="validateBeforeSubmit">
<label>Type A</label>
<input type="radio" v-model="Type" value="TypeA" />
<label>Type B</label>
<input type="radio" v-model="Type" value="TypeB" />
<table>
<tr v-if="Type==='TypeA'">
<td>
<select v-model="TypeA" v-validate="'required|not_in:Choose'" name="TypeA">
<option v-for="option in TypeAOptions" v-bind:value="option.value">
{{ option.value }}
</option>
</select>
<span v-if="errors.has('TypeA')">
{{ errors.first('TypeA')}}
</span>
</td>
</tr>
<tr v-if="Type==='TypeB'">
<td>
<select v-model="TypeB" v-validate="'required|not_in:Choose'" name="TypeB">
<option v-for="option in TypeBOptions" v-bind:value="option.value">
{{ option.value }}
</option>
</select>
<span v-if="errors.has('TypeB')">
{{ errors.first('TypeB')}}
</span>
</td>
</tr>
</table>
<button type="submit">Submit</button>
</form>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script src="https://cdn.jsdelivr.net/npm/vee-validate@latest/dist/vee-validate.js"></script>
<script>
Vue.use(VeeValidate);
var form = new Vue({
el: '#form',
data: {
Type: 'TypeA',
TypeA: 'Choose',
TypeAOptions: [{
value: 'Choose'
},
{
value: 'A',
},
{
value: 'B'
},
{
value: 'C'
},
{
value: 'D'
}
],
TypeB: 'Choose',
TypeBOptions: [{
value: 'Choose'
},
{
value: '1'
},
{
value: '2'
},
{
value: '3'
},
{
value: '4'
}
],
},
methods: {
validateBeforeSubmit() {
this.$validator.validateAll().then((result) => {
if (result) {
alert("Submit Success");
return;
}
alert("Correct them errors!");
});
}
}
})
</script>
我不知道如何解决这个问题,有人可以帮助我吗?
使用 v-show
而不是 v-if
来观察变化,因为 v-if
add/remove dom 元素和 vee-validate 检查 DOM。
<form id="form" @submit.prevent="validateBeforeSubmit">
<label>Type A</label>
<input v-on:change="changeType" type="radio" v-model="Type" value="TypeA" />
<label>Type B</label>
<input v-on:change="changeType" type="radio" v-model="Type" value="TypeB" />
<table>
<tr v-show="Type==='TypeA'">
<td>
<select v-model="TypeA" v-validate="'required|not_in:Choose'" name="TypeA">
<option v-for="option in TypeAOptions" v-bind:value="option.value">
{{ option.value }}
</option>
</select>
<span v-if="errors.has('TypeA')">
{{ errors.first('TypeA')}}
</span>
</td>
</tr>
<tr v-show="Type==='TypeB'">
<td>
<select v-model="TypeB" v-validate="'required|not_in:Choose'" name="TypeB">
<option v-for="option in TypeBOptions" v-bind:value="option.value">
{{ option.value }}
</option>
</select>
<span v-if="errors.has('TypeB')">
{{ errors.first('TypeB')}}
</span>
</td>
</tr>
</table>
<button type="submit">Submit</button>
</form>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script src="https://cdn.jsdelivr.net/npm/vee-validate@latest/dist/vee-validate.js"></script>
<script>
Vue.use(VeeValidate);
var form = new Vue({
el: '#form',
data: {
Type: 'TypeA',
TypeA: 'Choose',
TypeAOptions: [{
value: 'Choose'
},
{
value: 'A',
},
{
value: 'B'
},
{
value: 'C'
},
{
value: 'D'
}
],
TypeB: 'Choose',
TypeBOptions: [{
value: 'Choose'
},
{
value: '1'
},
{
value: '2'
},
{
value: '3'
},
{
value: '4'
}
],
},
computed:{
},
methods: {
changeType:function(){
this.errors.clear();
},
validateBeforeSubmit() {
this.$validator.validate(this.Type).then((result) => {
if (result) {
alert("Submit Success");
return;
}
alert("Correct them errors!");
});
}
}
})
</script>
此外,您正在验证所有字段意味着在两个下拉列表都在验证时。
让它发挥作用。意味着一次只验证一个下拉菜单我更改了这一行。
来自
this.$validator.validateAll()
到
this.$validator.validate(this.Type)
这个答案只是为了更新Niklesh Raut的答案需要做的一些修改,这是原始答案并且正确回答了当时的问题。
从那时起,vee-valdiate 已经更新到 V3.0,所以 vee-validate 的 cdn 需要指定为最新版本的 V2.0。此外,根据 link: https://github.com/logaretm/vee-validate/issues/1351 ,vee-validate 规则 "not_in" 已重命名为 "excluded" 。
因此,这些小改动将再次获得 Niklesh Raut 的代码 运行。非常感谢他和
分别为答案和问题的 OP。如果您觉得这有用(因为他们在这里完成了繁重的工作),请考虑对他们的答案和问题进行投票。
<form id="form" @submit.prevent="validateBeforeSubmit">
<label>Type A</label>
<input v-on:change="changeType" type="radio" v-model="Type" value="TypeA" />
<label>Type B</label>
<input v-on:change="changeType" type="radio" v-model="Type" value="TypeB" />
<table>
<tr v-show="Type==='TypeA'">
<td>
<select v-model="TypeA" v-validate="'required|excluded:Choose'" name="TypeA">
<option v-for="option in TypeAOptions" v-bind:value="option.value">
{{ option.value }}
</option>
</select>
<span v-if="errors.has('TypeA')">
{{ errors.first('TypeA')}}
</span>
</td>
</tr>
<tr v-show="Type==='TypeB'">
<td>
<select v-model="TypeB" v-validate="'required|excluded:Choose'" name="TypeB">
<option v-for="option in TypeBOptions" v-bind:value="option.value">
{{ option.value }}
</option>
</select>
<span v-if="errors.has('TypeB')">
{{ errors.first('TypeB')}}
</span>
</td>
</tr>
</table>
<button type="submit">Submit</button>
</form>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script src="https://cdn.jsdelivr.net/npm/vee-validate@2.2.15/dist/vee-validate.js"></script>
<script>
Vue.use(VeeValidate);
var form = new Vue({
el: '#form',
data: {
Type: 'TypeA',
TypeA: 'Choose',
TypeAOptions: [{
value: 'Choose'
},
{
value: 'A',
},
{
value: 'B'
},
{
value: 'C'
},
{
value: 'D'
}
],
TypeB: 'Choose',
TypeBOptions: [{
value: 'Choose'
},
{
value: '1'
},
{
value: '2'
},
{
value: '3'
},
{
value: '4'
}
],
},
computed:{
},
methods: {
changeType:function(){
this.errors.clear();
},
validateBeforeSubmit() {
this.$validator.validate(this.Type).then((result) => {
if (result) {
alert("Submit Success");
return;
}
alert("Correct them errors!");
});
}
}
})
</script>
我有一个使用无线电交换 select 列表的表单,但验证消息似乎无法正常工作。
这是我的表单,TypeA 验证消息确实有效:
但是当我将单选按钮更改为 TypeB 时,验证消息不起作用:
而且如果我点击提交按钮并且如果 TypeA 验证不正确并且我更改为 TypeB 提交它,验证将不会通过,因为它看起来像 vee-validate 只验证了 TypeA...
这是我的代码:
<form id="form" @submit.prevent="validateBeforeSubmit">
<label>Type A</label>
<input type="radio" v-model="Type" value="TypeA" />
<label>Type B</label>
<input type="radio" v-model="Type" value="TypeB" />
<table>
<tr v-if="Type==='TypeA'">
<td>
<select v-model="TypeA" v-validate="'required|not_in:Choose'" name="TypeA">
<option v-for="option in TypeAOptions" v-bind:value="option.value">
{{ option.value }}
</option>
</select>
<span v-if="errors.has('TypeA')">
{{ errors.first('TypeA')}}
</span>
</td>
</tr>
<tr v-if="Type==='TypeB'">
<td>
<select v-model="TypeB" v-validate="'required|not_in:Choose'" name="TypeB">
<option v-for="option in TypeBOptions" v-bind:value="option.value">
{{ option.value }}
</option>
</select>
<span v-if="errors.has('TypeB')">
{{ errors.first('TypeB')}}
</span>
</td>
</tr>
</table>
<button type="submit">Submit</button>
</form>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script src="https://cdn.jsdelivr.net/npm/vee-validate@latest/dist/vee-validate.js"></script>
<script>
Vue.use(VeeValidate);
var form = new Vue({
el: '#form',
data: {
Type: 'TypeA',
TypeA: 'Choose',
TypeAOptions: [{
value: 'Choose'
},
{
value: 'A',
},
{
value: 'B'
},
{
value: 'C'
},
{
value: 'D'
}
],
TypeB: 'Choose',
TypeBOptions: [{
value: 'Choose'
},
{
value: '1'
},
{
value: '2'
},
{
value: '3'
},
{
value: '4'
}
],
},
methods: {
validateBeforeSubmit() {
this.$validator.validateAll().then((result) => {
if (result) {
alert("Submit Success");
return;
}
alert("Correct them errors!");
});
}
}
})
</script>
我不知道如何解决这个问题,有人可以帮助我吗?
使用 v-show
而不是 v-if
来观察变化,因为 v-if
add/remove dom 元素和 vee-validate 检查 DOM。
<form id="form" @submit.prevent="validateBeforeSubmit">
<label>Type A</label>
<input v-on:change="changeType" type="radio" v-model="Type" value="TypeA" />
<label>Type B</label>
<input v-on:change="changeType" type="radio" v-model="Type" value="TypeB" />
<table>
<tr v-show="Type==='TypeA'">
<td>
<select v-model="TypeA" v-validate="'required|not_in:Choose'" name="TypeA">
<option v-for="option in TypeAOptions" v-bind:value="option.value">
{{ option.value }}
</option>
</select>
<span v-if="errors.has('TypeA')">
{{ errors.first('TypeA')}}
</span>
</td>
</tr>
<tr v-show="Type==='TypeB'">
<td>
<select v-model="TypeB" v-validate="'required|not_in:Choose'" name="TypeB">
<option v-for="option in TypeBOptions" v-bind:value="option.value">
{{ option.value }}
</option>
</select>
<span v-if="errors.has('TypeB')">
{{ errors.first('TypeB')}}
</span>
</td>
</tr>
</table>
<button type="submit">Submit</button>
</form>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script src="https://cdn.jsdelivr.net/npm/vee-validate@latest/dist/vee-validate.js"></script>
<script>
Vue.use(VeeValidate);
var form = new Vue({
el: '#form',
data: {
Type: 'TypeA',
TypeA: 'Choose',
TypeAOptions: [{
value: 'Choose'
},
{
value: 'A',
},
{
value: 'B'
},
{
value: 'C'
},
{
value: 'D'
}
],
TypeB: 'Choose',
TypeBOptions: [{
value: 'Choose'
},
{
value: '1'
},
{
value: '2'
},
{
value: '3'
},
{
value: '4'
}
],
},
computed:{
},
methods: {
changeType:function(){
this.errors.clear();
},
validateBeforeSubmit() {
this.$validator.validate(this.Type).then((result) => {
if (result) {
alert("Submit Success");
return;
}
alert("Correct them errors!");
});
}
}
})
</script>
此外,您正在验证所有字段意味着在两个下拉列表都在验证时。
让它发挥作用。意味着一次只验证一个下拉菜单我更改了这一行。 来自
this.$validator.validateAll()
到
this.$validator.validate(this.Type)
这个答案只是为了更新Niklesh Raut的答案需要做的一些修改,这是原始答案并且正确回答了当时的问题。 从那时起,vee-valdiate 已经更新到 V3.0,所以 vee-validate 的 cdn 需要指定为最新版本的 V2.0。此外,根据 link: https://github.com/logaretm/vee-validate/issues/1351 ,vee-validate 规则 "not_in" 已重命名为 "excluded" 。 因此,这些小改动将再次获得 Niklesh Raut 的代码 运行。非常感谢他和 分别为答案和问题的 OP。如果您觉得这有用(因为他们在这里完成了繁重的工作),请考虑对他们的答案和问题进行投票。
<form id="form" @submit.prevent="validateBeforeSubmit">
<label>Type A</label>
<input v-on:change="changeType" type="radio" v-model="Type" value="TypeA" />
<label>Type B</label>
<input v-on:change="changeType" type="radio" v-model="Type" value="TypeB" />
<table>
<tr v-show="Type==='TypeA'">
<td>
<select v-model="TypeA" v-validate="'required|excluded:Choose'" name="TypeA">
<option v-for="option in TypeAOptions" v-bind:value="option.value">
{{ option.value }}
</option>
</select>
<span v-if="errors.has('TypeA')">
{{ errors.first('TypeA')}}
</span>
</td>
</tr>
<tr v-show="Type==='TypeB'">
<td>
<select v-model="TypeB" v-validate="'required|excluded:Choose'" name="TypeB">
<option v-for="option in TypeBOptions" v-bind:value="option.value">
{{ option.value }}
</option>
</select>
<span v-if="errors.has('TypeB')">
{{ errors.first('TypeB')}}
</span>
</td>
</tr>
</table>
<button type="submit">Submit</button>
</form>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script src="https://cdn.jsdelivr.net/npm/vee-validate@2.2.15/dist/vee-validate.js"></script>
<script>
Vue.use(VeeValidate);
var form = new Vue({
el: '#form',
data: {
Type: 'TypeA',
TypeA: 'Choose',
TypeAOptions: [{
value: 'Choose'
},
{
value: 'A',
},
{
value: 'B'
},
{
value: 'C'
},
{
value: 'D'
}
],
TypeB: 'Choose',
TypeBOptions: [{
value: 'Choose'
},
{
value: '1'
},
{
value: '2'
},
{
value: '3'
},
{
value: '4'
}
],
},
computed:{
},
methods: {
changeType:function(){
this.errors.clear();
},
validateBeforeSubmit() {
this.$validator.validate(this.Type).then((result) => {
if (result) {
alert("Submit Success");
return;
}
alert("Correct them errors!");
});
}
}
})
</script>