I want to disable my submit button until my form is filled out correctly, this is what I have so far:
<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>
The above only prints an error message and disables my submit button after I've started inputting a value. I need it to be disabled from the start, before I start interacting with the input, so that I cannot send an empty string.
Another question is if there is a better way than using v-if
to do this?
EDIT:
userCreate: {
customerId: null,
userPrincipalName: '',
name: 'unknown',
isAdmin: false,
isGlobalAdmin: false,
parkIds: []
}
To check whether a form is invalid or not we can add a
computed
property like this:Now if you want to start checking immediately before user interaction with any of the fields, you can validate manually inside
mounted
lifecycle hooks:or using computed
and use
One way to disable a button until all the values you need are filled, is to use a computed property that will return bool if all values are assigned or not
Example:
Create a computed property like this:
And bind it to the html
disabled
attribute as:This means, disable the button if
!isComplete
is trueAlso, in your case you don't need two if/else-bound buttons. You can use just one to hide/show it based on if the form is completed or has any errors:
This button will be disabled until all fields are filled and no errors are found
Setting up the button to be
:disabled:"errors.any()"
disables the button after validation. However, when the component first loads it will still be enabled.Running
this.$validator.validate()
in themounted()
method, as @im_tsm suggests, causes the form to validate on startup and immediately show the error messages. That solution will cause the form to look pretty ugly. Also, theObject.keys(this.fields).some(key => this.fields[key].invalid);
syntax is super ugly.Instead, run the validator when the button is clicked, get the validity in the promise, and then use it in a conditional. With this solution, the form looks clean on startup but if they click the button it will show the errors and disable the button.
Validator API
Probably simpliest way is to use ValidationObserver slot for a form. Like this:
More info - Validation Observer
Another way is to make use of v-validate.initial
This will execute the validation of the email input element after the page is loaded. And makes that your button is disabled before interacting with the input.