JSF f:événement preRenderView est déclenchée par f:appels ajax et partielle rend, quelque chose d'autre?
Nous avons donc un f:événement:
<f:metadata>
<f:event type="preRenderView" listener="#{dashboardBacking.loadProjectListFromDB}"/>
</f:metadata>
Qui est déclenché comme souhaité sur le chargement initial de la page (le rendu).
Cependant cette preRenderView événement est également déclenchée par une requête ajax de page partielle de rendu, qui re-rend un h:panelgroup avec l'id projectListing, comme ci-dessous.
<h:commandButton action="#{mrBean.addProject}" value="Create Project"
title="Start a new project">
<f:ajax render="projectListing" />
</h:commandButton>
Je veux seulement le dashboardBacking.loadProjectListFromDB à être appelé pour la première page de rendu, mais pas quand il y a un ajax partielle de rendu. Est-il plus approprié de l'événement ou de la méthode je pourrais utiliser?
- Voir Kawu de réponse: stackoverflow.com/a/10363027/1599699
<f:viewaction />
est un excellent moyen pour ce faire.
Vous devez vous connecter pour publier un commentaire.
Une autre option serait de mettre votre
preRenderView
fonctionnalités dans un@PostConstruct
méthode deViewScoped
managed bean. Cette logique serait exécuté lorsque le bean est initialisé, et vous vous maintenez la même instance du bean pour tous vos requêtes ajax jusqu'à ce que vous changez de point de vue.J'ai eu le même besoin de ne pas trop longtemps. J'ai fini par utiliser quelque chose suggéré par BalusC.
Il y a une méthode dans la FacesContext classe qui vous permet de savoir si vous avez affaire à une véritable demande ou un traitement partiel de la sorte:
De cette façon, vous pouvez toujours utiliser le preRenderView technique et vérifier si c'est une publication de l'auditeur. J'ai trouvé particulièrement utile, car j'avais besoin d'un bean de session comme utilisateur de naviguer vers une autre page et de revenir. Si j'ai utilisé de vue de l'étendue des haricots (comme suggéré ci-dessus par Brian), je voudrais perdre de l'info que j'ai eu avant de naviguer à l'extérieur.
Une autre possibilité est de vérifier si la requête est une requête ajax ou pas dans le preRenderView méthode. Vous pouvez également effectuer la charge conditionnellement tenant compte d'autres facteurs tels que si la demande en est un ou pas et si la validation a échoué ou non (afficher les paramètres de validation peut échouer sur la page).
Le "nouvel-âge" moyen de la manipulation de ce qui est décrit ici:
http://www.coderanch.com/t/509746/JSF/java/duplicate-call-preRenderView-event#2634752
Vous pourriez essayer de connecter le preRenderView écouteur d'événement à un élément individuel, plutôt que de la page. Choisir un composant qui n'est pas rendu lors d'une requête Ajax.
Un petit problème, c'est que le point de vue des paramètres n'ont pas été définies lors de la @PostConstruct méthode est appelée j'ai donc dû obtenir explicitement:
mise à jour: en fait, j'ai fini par faire le @PostConstruct chose, son beaucoup plus propre.
J'ai eu exactement le même problème aujourd'hui avec une séance d'étendue de la sauvegarde de haricot. À savoir, j'avais enregistré un écouteur d'événement de la méthode sur la sauvegarde de session de l'étendue du bean qui a été enregistré avec le preRenderView. Mais j'ai trouvé que c'était également tiré sur certains Ajax opérations de tri sur un PrimeFaces 3 dataTable composant. Donc, ce que j'ai fait a l'aide d'un booléen variable d'instance de la session d'étendue de la sauvegarde de la fève à la assurez-vous que le corps de l'écouteur d'événement de la méthode exécutée uniquement la première fois (le booléen a agi comme un drapeau). Je suis sûr que c'est assez naïf, et sans doute cassé sur certains cas donc, je serais intéressé de savoir pourquoi et comment cette approche simpliste peut échouer.