Il existe un formulaire simple :
<form>
<input type="checkbox" name="checkbox"> Checkbox
<input type="email" name="email">
<button>Submit</button>
</form>
La tâche est : e-mail Le champ doit être affiché uniquement si case à cocher est vérifié, et bouton ne doit être affiché que si e-mail rempli
J'ai donc décidé de l'implémenter comme ceci :
-
e-mail y bouton doit avoir
data-visible
attribut avec conditions d'affichage - case à cocher y e-mail les contributions doivent être écoutées les changements
- Tout case à cocher y e-mail les modifications doivent être vérifiées pour afficher/masquer
data-visible
éléments basés sur des conditions
Le résultat est :
// inputs to listen based on id attr (temp solution)
let inputs = form.querySelectorAll('[id]');
// elements to set/unset visibility
let visibles = form.querySelectorAll('[data-visible]');
// Loop all data-visible elements to toggle display: block|none based on evaluated condition
function sync() {
for (let v of visibles) {
if(eval(v.getAttribute('data-visible'))) {
v.style.display = 'block';
} else {
v.style.display = 'none';
}
}
}
// Listen to all inputs changes and sync with new data
for (let input of inputs) {
input.addEventListener('change', function(e) {
sync()
});
}
sync() // Hide everything that must be hidden on init
<form id="form">
<input type="checkbox" name="checkbox" id="checkbox"> Checkbox
<input data-visible="checkbox.checked" type="email" name="email" id="email">
<button data-visible="email.value">Submit</button>
</form>
Ou sur codepen
En fait, il ne s'agit que d'une approche, les attributs requis/désactivés/classés doivent également être basculés en fonction des modifications des données du formulaire.
En fait, ce que j'essaie de faire, c'est de mettre en œuvre une approche simple de type MVVM, mais en me basant sur les données du formulaire plutôt que sur le modèle JS.
Dans une tâche réelle, il s'avère que ~20 de tous les éléments de formulaire peuvent être écoutés pour toutes leurs modifications, et chaque modification évaluera toutes les ~20 conditions à la fois pour définir ou désactiver certains attributs.
Le problème est donc le suivant : cela pourrait-il causer de graves problèmes de mémoire et de processeur ? Ou bien tout va bien et les cadres MVVM font presque la même chose ? Puis-je le faire ?