Je veux désactiver mon bouton d'envoi jusqu'à ce que mon formulaire soit rempli correctement, voici ce que j'ai jusqu'à présent:
<form>
<input type="text" class="form-control" v-validate="'required|email'" name="email" placeholder="Email" v-model="userCreate.userPrincipalName" />
<span v-show="errors.has('email')">{{ errors.first('email') }}</span>
<button v-if="errors.any()" disabled="disabled" class="btn btn-primary" v-on:click="sendInvite();" data-dismiss="modal" type="submit">Send Invite</button>
<button v-else="errors.any()" class="btn btn-primary" v-on:click="sendInvite();" data-dismiss="modal" type="submit">Send Invite</button>
</form>
Ce qui précède imprime uniquement un message d'erreur et désactive le bouton d'envoi une fois que j'ai commencé à saisir une valeur. J'ai besoin qu'elle soit désactivée dès le début, avant de commencer à interagir avec l'entrée, de sorte que je ne puisse pas envoyer de chaîne vide.
Une autre question est de savoir s'il existe un meilleur moyen que d'utiliser v-if
pour le faire.
MODIFIER:
userCreate: {
customerId: null,
userPrincipalName: '',
name: 'unknown',
isAdmin: false,
isGlobalAdmin: false,
parkIds: []
}
Une façon de désactiver un bouton jusqu'à ce que toutes les valeurs dont vous avez besoin soit renseignée consiste à utiliser une propriété calculée qui retournera un booléen si toutes les valeurs sont attribuées ou non.
Exemple:
Créez une propriété calculée comme ceci:
computed: {
isComplete () {
return this.username && this.password && this.email;
}
}
Et liez-le à l'attribut html disabled
en tant que:
<button :disabled='!isComplete'>Send Invite</button
Cela signifie, désactivez le bouton si !isComplete
est vrai.
De plus, dans votre cas, vous n'avez pas besoin de deux boutons if/else-bound. Vous pouvez n’en utiliser qu’un seul pour le masquer/l’afficher selon que le formulaire est rempli ou contient des erreurs:
<button :disabled="errors.any() || !isCompleted" class="btn btn-primary" v-on:click="sendInvite();" data-dismiss="modal" type="submit">Send Invite</button>
Ce bouton sera désactivé jusqu'à ce que tous les champs soient remplis et qu'aucune erreur ne soit trouvée
Pour vérifier si un formulaire est invalide ou non, nous pouvons ajouter une propriété computed
comme celle-ci:
computed: {
isFormInValid() {
return Object.keys(this.fields).some(key => this.fields[key].invalid);
},
},
Maintenant, si vous voulez commencer à vérifier immédiatement avant l’interaction de l’utilisateur avec l’un des champs, vous pouvez valider manuellement dans les hooks mounted
lifecycle:
mounted() {
this.$validator.validate();
}
ou en utilisant calculé
computed: {
formValidated() {
return Object.keys(this.fields).some(key => this.fields[key].validated) && Object.keys(this.fields).some(key => this.fields[key].valid);
}
}
et utilise
button :disabled="!formValidated" class="btn btn-primary" v-on:click="sendInvite();" data-dismiss="modal" type="submit">
Une autre méthode consiste à utiliser v-validate. initial
<input type="text" class="form-control" v-validate.initial="'required|email'" name="email" placeholder="Email" v-model="userCreate.userPrincipalName" />
Ceci exécutera la validation de l’élément d’entrée email après le chargement de la page. Et fait que votre bouton est désactivé avant d'interagir avec l'entrée.
Configurer le bouton pour qu'il soit :disabled:"errors.any()"
désactive le bouton après la validation. Cependant, lors du premier chargement du composant, il sera toujours activé.
L'exécution de this.$validator.validate()
dans la méthode mounted()
, comme le suggère @im_tsm, entraîne la validation du formulaire au démarrage et l'affichage immédiat des messages d'erreur. Cette solution rendra le formulaire assez moche. En outre, la syntaxe Object.keys(this.fields).some(key => this.fields[key].invalid);
est super moche.
Au lieu de cela, exécutez le validateur lorsque le bouton est cliqué, obtenez la validité de la promesse, puis utilisez-la de manière conditionnelle. Avec cette solution, le formulaire a l'air propre au démarrage, mais s'il clique sur le bouton, il affichera les erreurs et le désactivera.
<button :disabled="errors.any()" v-on:click="sendInvite();">
Send Invite
</button>
sendInvite() {
this.$validator.validate().then(valid=> {
if (valid) {
...
}
})
}