フォームが正しく記入されるまで送信ボタンを無効にしたいと思っています。
<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>
上記はエラーメッセージを出力し、値の入力を開始した後に送信ボタンを無効にします。空の文字列を送信できないように、入力との対話を開始する前に、最初から無効にする必要があります。
別の質問は、v-if
を使用してこれを行うよりも良い方法があるかどうかです。
編集:
userCreate: {
customerId: null,
userPrincipalName: '',
name: 'unknown',
isAdmin: false,
isGlobalAdmin: false,
parkIds: []
}
必要なすべての値が入力されるまでボタンを無効にする1つの方法は、すべての値が割り当てられているかどうかに応じてブール値を返す計算プロパティを使用することです
例:
次のような計算プロパティを作成します。
computed: {
isComplete () {
return this.username && this.password && this.email;
}
}
そして、それをhtml disabled
属性にバインドします:
<button :disabled='!isComplete'>Send Invite</button
つまり、!isComplete
はtrue
また、あなたの場合、2つのif/else-boundボタンは必要ありません。フォームが完成したかどうかに基づいて、1つだけを使用して非表示/表示できますまたはにエラーがあります:
<button :disabled="errors.any() || !isCompleted" class="btn btn-primary" v-on:click="sendInvite();" data-dismiss="modal" type="submit">Send Invite</button>
このボタンは、すべてのフィールドが入力され、エラーが検出されなくなるまで無効になります
ボタンを:disabled:"errors.any()"
に設定すると、ボタンafter検証が無効になります。ただし、コンポーネントが最初にロードされるときは、引き続き有効になります。
@im_tsmが示唆するように、this.$validator.validate()
メソッドでmounted()
を実行すると、フォームが起動時に検証され、すぐにエラーメッセージが表示されます。この解決策により、フォームは非常にいものになります。また、Object.keys(this.fields).some(key => this.fields[key].invalid);
構文は非常に見苦しいです。
代わりに、ボタンがクリックされたときにバリデーターを実行し、promiseで有効性を取得してから、条件で使用します。このソリューションでは、起動時にフォームはきれいに見えますが、ボタンをクリックするとエラーが表示され、ボタンが無効になります。
<button :disabled="errors.any()" v-on:click="sendInvite();">
Send Invite
</button>
sendInvite() {
this.$validator.validate().then(valid=> {
if (valid) {
...
}
})
}
別の方法は、v-validateを利用することです。初期
<input type="text" class="form-control" v-validate.initial="'required|email'" name="email" placeholder="Email" v-model="userCreate.userPrincipalName" />
これにより、ページがロードされた後に電子メール入力要素の検証が実行されます。また、入力を操作する前にボタンを無効にします。
フォームが無効かどうかを確認するには、次のようなcomputed
プロパティを追加します。
computed: {
isFormInValid() {
return Object.keys(this.fields).some(key => this.fields[key].invalid);
},
},
ユーザーがフィールドと対話する直前にチェックを開始したい場合は、mounted
ライフサイクルフック内で手動で検証できます。
mounted() {
this.$validator.validate();
}
または計算を使用して
computed: {
formValidated() {
return Object.keys(this.fields).some(key => this.fields[key].validated) && Object.keys(this.fields).some(key => this.fields[key].valid);
}
}
そして使用
button :disabled="!formValidated" class="btn btn-primary" v-on:click="sendInvite();" data-dismiss="modal" type="submit">