2010-09-18 5 views
1

J'ai une interface de page unique très dynamique où divers événements utilisateur déclenchent de nouveaux champs à afficher sur l'écran. J'utilise jsf 1.1 et ajax de base sans la possibilité d'utiliser submit partiel. En raison de ces limitations, j'ai marqué tous mes champs requis faux et immédiatement faux. L'idée est de valider UNIQUEMENT lorsque l'utilisateur tente de passer à la page suivante dans une méthode d'action PAS quand il tabule et exécute un événement ajax. Je mets immédiatement faux parce que j'ai besoin d'entrée pour le rendre modal afin que je puisse conditionnellement rendre certains champs basés sur la logique métier. PROBLEME: Je connais à l'avance une liste des identifiants UIInput "possibles" qui peuvent ou non s'afficher sur l'écran à un moment donné. Mon but est de parcourir toutes ces entrées UI, de vérifier si elles sont rendues, non nulles, et non vides sinon marquer l'UIInput par erreur.Comment parcourir tous les composants affichés à l'écran

Ceci fonctionne à l'exception des champs qui ne sont pas affichés à l'écran. Par exemple, j'ai un champ "amountInput" qui a une propriété XHTML rendue à false pour qu'elle n'apparaisse pas à l'écran. Du point de vue de l'affichage, cela fonctionne, mais en invoquant mon action, ce champ montre toujours sa propriété rendue comme vraie, donc je n'ai aucun moyen de savoir si je devrais le valider ou non.

Quelles sont mes options ici?

public boolean validate() { 
    boolean hasValidMinimumData = true; 

    final List<UIInput> componentList = getComponentList(); 
    if (CollectionUtils.isNotEmpty(componentList)) { 
     for (UIInput curComponent : componentList) { 
      final Object curComponentValue = curComponent.getValue(); 
      if (curComponent.isRendered() && (curComponentValue == null || isNoValue(curComponent))) { 
       setError(curComponent); // applies the error 
       hasValidMinimumData = false; 
      } 
     } 
    } 

    return hasValidMinimumData; 
} 

Répondre

0

RÉSOLU! Le problème était que dans mon XHTML j'avais défini l'attribut rendu sur un composant de table qui contenait mon composant d'entrée. Je pensais que cela réglerait à son tour l'attribut rendu de manière appropriée sur tous ses enfants mais apparemment pas.

La simple définition de l'attribut de rendu conditionnel dans mon code XHTML sur le composant d'entrée réel a résolu le problème.

1

Vous devez veiller à ce que le même état responsable de l'issue de l'attribut rendered est conservé lors de la demande du formulaire présenter comme pendant l'affichage initial.

Le moyen le plus simple consiste à mettre le bean responsable des conditions dans la portée de la session. Si vous préférez l'avoir dans la portée de la demande (ce qui est une décision très raisonnable), alors je suggère de saisir Tomahawk'st:saveState pour cela.

<t:saveState value="#{bean}" /> 

Cela dit, avez-vous déjà considéré Ajax4jsf? Il est compatible avec JSF 1.1 et offre une intégration transparente d'Ajax avec JSF.

+0

Merci BalusC. Votre nom vous poursuit - j'ai appris beaucoup de votre site. Malheureusement, mettre le viewbean dans la portée de la session n'a pas fonctionné. J'ai mis un point d'arrêt dans mon conditionnel et il a rendu exactement ce qu'il devait avant que mon action ait lieu. C'est comme si l'attribut rendu lié au bean de support était différent de la définition de l'attribut rendu en XHTML. – gevaudan

+0

J'aimerais utiliser Ajax4jsf mais ce n'est pas une option sur mon lieu de travail. Compte tenu de mes exigences, je vois deux solutions, dont chacune a ses défauts: 1. Implémenter toutes les validations de champs requises dans javascript 2. Dupliquer la logique métier dans l'action pour déterminer quand et quand ne pas valider un champ puisque nous pouvons ne semblent pas s'appuyer sur l'attribut rendu. – gevaudan

+0

La propriété el rendue est-elle évaluée pendant la réponse de rendu ou est-elle appliquée dans la phase de mise à jour du modèle/de demande d'invocation? Dans mon code actuel, je vérifie l'attribut rendu dans l'action afin qu'il soit avant la réponse de rendu. Peut-être que c'est un problème. Pour être honnête, j'étais un peu surpris que je puisse même trouver mon composant qui n'est pas affichable car je pensais que le réglage render = false l'exclurait de l'arborescence, ce qui le rendrait indisponible. – gevaudan

Questions connexes