J'ai une entrée qui fonctionne correctement: après que l'erreur a été renvoyée du serveur au client, je vois {{value}}
.
<div class="form-group">
<label class="col-md-8 control-label">Foo</label>
<input class="form-control" v-model="foo" :class="{' is-invalid': errors.foo}">
<div class="invalid-feedback" v-if="errors.foo">
<strong v-for="value in errors.foo">{{value}}</strong>
</div>
</div>
Donc je suppose que div
avec class="invalid-feedback"
va de display: none
à display: block
uniquement lorsque div
qui a class="invalid-feedback"
est au même niveau DOM avec <input class="form-control is-invalid">
.
<div>
<input class="form-control" :class="{' is-invalid': errors.foo}">
<div class="invalid-feedback" v-if="errors.foo">
<!-- this example would work -->
</div>
</div>
<div>
<input class="form-control" :class="{' is-invalid': errors.foo}">
</div>
<div>
<div class="invalid-feedback" v-if="errors.foo">
<!-- this example would not work
because error div isn't on the same DOM level with input -->
</div>
</div>
Ai-je raison? Je n'ai rien trouvé dans docs à propos de DOM.
Si oui, quelle solution de contournement convient au cas où je veux afficher une erreur à l'intérieur de div
avec class="invalid-feedback"
, mais l'entrée "connectée" n'est pas au même niveau DOM? En fait, je veux faire fonctionner mon 2ème exemple.
MISE À JOUR: Je peux ajouter quelques <div class="form-control" :class="{' is-invalid': errors.foo}" style="display: none;">
au même niveau DOM où <div class="invalid-feedback">
oui, mais ce serait du code spaghetti.
Vous utilisez v-if="errors.foo"
sur le invalid-feedback
div, il sera donc inséré dans le DOM uniquement lorsque errors.foo
est véridique, peu importe où il se trouve dans le DOM.
Quant au style:
La validation des formulaires HTML est appliquée via les deux pseudo-classes CSS,
:invalid
et:valid
. Cela s'applique à<input>
,<select>
, et<textarea>
éléments.
Ainsi, le placement du .invalid-feedback
div est important lorsque vous utilisez le comportement par défaut , qui applique le style avec le combinateur général frère ~
.was-validated .form-control:invalid~.invalid-feedback {/*...*/}
Il y a un .was-validated
classe que vous devez ajouter sur un élément parent qui appliquera le style d'erreur sur les éléments invalides.
<div :class="{'was-validated': errors.foo}">
<input class="form-control" :class="{' is-invalid': errors.foo}">
</div>
...
<div :class="{'was-validated': errors.foo}">
<div class="invalid-feedback" v-show="errors.foo">...</div>
</div>
Comme il doit s'agir d'un frère général, vous pouvez forcer le display: block
avec v-show
ou utilisez un CSS personnalisé comme d-block
.
Comme solution de rechange,
.is-invalid
et.is-valid
les classes peuvent être utilisées à la place des pseudo-classes pour la validation côté serveur. Ils ne nécessitent pas de.was-validated
classe parent.
Il s'agit d'un problème connu avec .input-group
discuté dans un numéro .
Si vous trouvez que ça commence à devenir désordonné, vous pouvez évaluer la possibilité d'encapsuler les entrées dans des composants qui appliquent votre style, puis de réutiliser simplement vos composants.
Ou vous pouvez utiliser un wrapper Vue de bootstrap, comme bootstrap-vue .