验证“必需”验证仅在更改字段时才有效

时间:2018-05-10 09:00:33

标签: vue.js vuejs2 vee-validate

以下是我的代码。我的表格中有三个字段。名字,中间名,姓氏。所有这些字段都按要求设置。唯一的区别是“Firstname& Lastname”包含输入标记,但“Middlename”包含b-form-input标记。实际上我的问题是,当我关注(模糊)这些(“名字和姓氏”)字段时,它会抛出一个必需的错误但是当我为(“Middlename”)字段执行相同操作时它不会Image1。我必须在那个(“Middlename”)字段Image2中输入值,然后我删除它抛出错误的值 Image3,即必需的验证仅在“(”中间名“)字段的”更改“上工作。这是什么原因?

<template>
 <b-card>
    <h4 slot="header" class="card-title">Employee</h4>
        <b-row>
            <b-col sm="3">
              <b-form-group>
                <label for="name">First Name </label>
                <input type="text" id=""  class="form-control" placeholder="Enter your name" v-validate="'required'" name="Firstname">
                        <span v-show="errors.has('Firstname')" class="is-danger">{{ errors.first('Firstname') }}</span>
               </b-form-group>
            </b-col>
            <b-col sm="3">
              <b-form-group>
                <label for="name">Middle Name </label>
                <b-form-input type="text" id=""  class="form-control" placeholder="Enter your name" v-validate="'required'" name="Middlename"> </b-form-input>
                  <span v-show="errors.has('Middlename')" class="help is-danger">{{ errors.first('Middlename') }}</span>
              </b-form-group>
            </b-col>
             <b-col sm="3">
              <b-form-group>
                <label for="name">Last Name </label>
                <input type="text" id=""  class="form-control" placeholder="Enter your middle name" v-validate="'required|Name'" name="Lastname">
                        <span v-show="errors.has('Lastname')" class="help is-danger">{{ errors.first('Lastname') }}</span>
              </b-form-group>
            </b-col>
        </b-row>
        <input type="submit" value="Submit" @click="validateForm">
 </b-card>
</template>

<script>
import Vue from 'vue'
import VeeValidate from 'vee-validate';
Vue.use(VeeValidate);

export default {
  name: 'addEmpl',
   created: function() {
    this.$validator.extend('Name', {
    getMessage: field => '* Enter valid ' + field + '',
    validate: value => /^[a-zA-Z]*$/.test(value)
    });
}
}
</script>

<style lang="scss" scoped>
.is-danger{
  color:  RED;
}
</style>

1 个答案:

答案 0 :(得分:1)

首先,我也是Vue.js和Vee-validate的新手,所以我可以纠正。

2个字段和Middlename字段之间的区别在于,它是组件而不是本机输入字段。

从本质上讲,您需要使组件的行为像输入一样,即发出必要的事件,以便Vee-validate可以对它们进行选择(“ input”,“ change”,“ blur” 等)。

例如,如果您的组件是一个在输入上换行的div,它将是这样的:

<template>
   <div class="myClassForDiv">
      <input 
         type="text"
         class="myClass"
         @blur="$emit('blur')"
         @input="$emit('input', $event.target.value)"
      >
   </div>
</template>

<script>
   export default {
      name: "b-form-input"
   }
</script>

与该问题有关的部分是@blur="$emit('blur')"。没有此行,VeeValidate无法通知发生的模糊事件,因此无法验证(我不知道VeeValidate默认会听其他哪些事件,但是'blur'对我有用,而'focusout'对我不起作用。始终可以将data-vv-validate-on指令用于特定于您组件的特殊事件。

您可以通过VeeValidate库的维护者来参考本文。注意他如何通过使组件发出所有正确的事件来创建与VeeValidate完美配合的组件。

https://medium.com/@logaretm/authoring-validatable-custom-vue-input-components-1583fcc68314