Puis-je mettre à jour un composant JSF à partir d'une méthode de bean de support JSF?

100

Existe-t-il un moyen pour qu'un bean de support JSF provoque une mise à jour d'un composant sur la page? Je ne cherche pas à utiliser un composant ajax avec un attribut de mise à jour pour mettre à jour un composant sur la page. J'ai besoin de déclencher une mise à jour à partir d'une méthode de bean de sauvegarde JSF. Notez que la mise à jour sur la page peut avoir lieu après la fin de cette méthode ou avant son achèvement. J'utilise PrimeFaces, s'il existe une solution qui peut être obtenue en utilisant PrimeFaces.

Les meilleures pratiques
la source
Peut déclencher une erreur de validation: stackoverflow.com/a/14401741/1599699
Andrew

Réponses:

183

À l'aide de l'API JSF standard, ajoutez l'ID client à PartialViewContext#getRenderIds().

FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add("foo:bar");

À l'aide de l'API spécifique à PrimeFaces, utilisez PrimeFaces.Ajax#update().

PrimeFaces.current().ajax().update("foo:bar");

Ou si vous n'êtes pas encore sur PrimeFaces 6.2+, utilisez RequestContext#update().

RequestContext.getCurrentInstance().update("foo:bar");

Si vous utilisez la bibliothèque d'utilitaires JSF OmniFaces , utilisez Ajax#update().

Ajax.update("foo:bar");

Indépendamment de la manière, notez que ces ID client doivent représenter des ID client absolus qui ne sont pas précédés du NamingContainercaractère séparateur comme vous le feriez du côté de la vue.

BalusC
la source
6
Il semble que je ne puisse pas faire fonctionner cela pendant la phase de réponse de rendu (qui, malheureusement, est où je suis obligé de placer ce code). Si je place dans Invoke Application ou dans des phases antérieures, les choses fonctionnent correctement. Des solutions de contournement pour être dans la phase de réponse de rendu?
BestPractices
8
Non, c'est trop tard. Déplacez le travail pour appeler la phase d'action ou avant la phase de réponse de rendu. Invoquer la méthode par <f:ajax listener>ou<f:event type="preRenderView" listener>
BalusC
Une idée sur la façon de faire cela avec JSF 1.2? Je peux poser une nouvelle question si la réponse est trop longue / complexe.
RinaldoPJr
@RinaldoPJr: JSF 1.2 n'a pas de concept de <f:ajax>. Ceci est introduit depuis JSF 2.0. Vous devrez recourir aux installations spécifiques de la bibliothèque de composants JSF 1.2.
BalusC
@DanielK: Aucune idée. Je ne fais pas Trinidad. Utilisez simplement l'approche standard de l'API JSF si vous ne parvenez toujours pas à comprendre le chemin de Trinidad.
BalusC
9

J'ai également essayé de mettre à jour un composant à partir d'un bean / classe de support jsf

Vous devez effectuer les opérations suivantes après avoir manipulé le composant d'interface utilisateur:

FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add(componentToBeRerendered.getClientId())

Il est important d'utiliser le clientId au lieu du componentId (côté serveur) !!

Frithjof Schaefer
la source
7

Le RequestContextest obsolète de Primefaces 6.2 . À partir de cette version, utilisez les éléments suivants:

if (componentID != null && PrimeFaces.current().isAjaxRequest()) {
    PrimeFaces.current().ajax().update(componentID);
}

Et pour exécuter javascript à partir du backbean, utilisez cette méthode:

PrimeFaces.current().executeScript(jsCommand);

Référence:

ℛɑƒæĿᴿᴹᴿ
la source
1

Tout n'est possible que s'il y a suffisamment de temps pour faire des recherches :)

Ce que je dois faire, c'est comme avoir des personnes que j'itère dans une interface utilisateur: répéter et afficher les noms et autres champs dans les entrées. Mais l'un des champs était singleSelect - A et en fonction de sa valeur, mettre à jour une autre entrée - B. même ui: répéter n'a pas d'id que j'ai mis et il est apparu dans l'arborescence DOM

<ui:repeat id="peopleRepeat"
value="#{myBean.people}"
var="person" varStatus="status">

Que les identifiants dans le html étaient quelque chose comme:

myForm:peopleRepeat:0:personType
myForm:peopleRepeat:1:personType

Que dans la vue, j'ai une méthode comme:

<p:ajax event="change"
listener="#{myBean.onPersonTypeChange(person, status.index)}"/>

Et sa mise en œuvre était dans le bean comme:

String componentId = "myForm:peopleRepeat" + idx + "personType";
PrimeFaces.current().ajax().update(componentId);

Donc, de cette façon, j'ai mis à jour l'élément du bean sans aucun problème. PF version 6.2

Bonne chance et bon codage :)

panayot_kulchev_bg
la source
Si vous avez l'événement de modification ajax sur le personType, il est superflu de transmettre à la fois la personne et l'index à l'écouteur ajax. Vous pouvez obtenir à la fois l'identifiant et la valeur de l'événement. Mais votre solution peut être nécessaire pour votre cas d'utilisation spécifique, mais comme il n'y a pas d'exemple complet (dans une saveur d' exemple reproductible minimale ), il est difficile de le dire.
Kukeltje