J'ai plusieurs cases PrimeFaces sur une page. Si vous cliquez sur la case à cocher principale, toutes les autres cases à cocher doivent être vérifiées / non cochées. Avec les cases HTML simples, ce serait un problème facile. Mais parce que PrimeFaces ne montre pas la case à cocher elle-même, mais une image, le code JavaScript suivant ne fonctionne pas:
<script type="text/javascript"> $(document).ready(function() { var masterCheckbox = $(".ui-chkbox.master :checkbox"); var slaveCheckboxes = $(".ui-chkbox:not(.master) :checkbox"); updateMaster(); masterCheckbox.change(updateSlaves); slaveCheckboxes.change(updateMaster); function updateMaster() { var allSlavesChecked = true; slaveCheckboxes.each(function() { if (!$(this).is(':checked')) { allSlavesChecked = false; } }); masterCheckbox.attr("checked", allSlavesChecked); } function updateSlaves() { var masterChecked = masterCheckbox.is(":checked"); slaveCheckboxes.each(function() { $(this).attr("checked", masterChecked); }); } }); </script>
Je sais que je pourrais utiliser le widget PrimeFacesVar pour basculer les cases à cocher, mais je ne sais pas comment obtenir les objets de widget PrimeFaces avec JavaScript. Je pense que RichFaces ajoute la propriété du composant à l'élément DOM, mais PrimeFaces ne le fait pas. Quelqu'un connaît-il une solution à ce problème?
Vous étiez correct – si vous créez votre composant comme ceci:
<p:selectBooleanCheckbox value="val" widgetVar="myCheckbox"/>
Vous pouvez accéder à la case à cocher simplement en se référant à son widgetVar, en l'occurrence en appelant l'API côté client PrimeFaces pour la marquer comme vérifiée:
<script> myCheckbox.check(); </script>
Vous pouvez ensuite lier l'option Onchange de votre case principale à une méthode javascript qui a vérifié ou désactivé l'état de toutes les cases "esclaves" en fonction de l'état de la case à cocher principale (vous suggérera de stocker l'état dans un champ caché).
Notez qu'il peut être plus facile de gérer l'événement ajax "changer" et mettre en œuvre la logique de vérification / déconnexion du côté du serveur. Assurez-vous que vous fournissez tous les identifiants de toutes les cases à cocher esclave dans l'attribut de mise à jour du composant p: ajax:
<p:selectBooleanCheckbox id="masterChkBox" ...> <p:ajax event="change" listener="#{yourBean.handleMasterChange}" update="...all slavecheckbox ids..."/> </p:selectBooleanCheckbox>