2 votes

JSF (et PrimeFaces) Comment passer un paramètre à une méthode dans un ManagedBean ?

J'ai un objet Employé que j'affiche en inputtext. Par exemple, le prénom de l'employé est affiché dans un texte d'entrée. Lorsque la valeur de ce prénom change, une méthode est appelée. Avant que cela ne soit fait, je veux appeler une méthode qui sauvegarde l'ID de l'employé dans le managedbean afin que je sache quel employé doit être modifié. Comment dois-je faire, j'ai obtenu ceci jusqu'à présent :

<h:outputText value="First name:"/>
<p:inplace id="firstname" editor="true">
     <p:ajax event="save" onsuccess="#{employeeController.saveName()}"/>
     <p:inputText id="firstName" value="#{emp.firstName}"  
                  required="true" label="text"
                  valueChangeListener="#{employeeController.firstNameChanged}">
     <p:ajax event="valueChange" listener="#{employeeController.onValueChangedStart}"/>
     </p:inputText>
</p:inplace>

Je suppose que je devrais transmettre l'ID avec la méthode onValueChangedStart ou firstNameChanged. Comment dois-je m'y prendre ? Ou existe-t-il un meilleur moyen de le faire ? Il existe un getter pour l'emp, donc #{emp}.id pour le récupérer.

11voto

BalusC Points 498232

En supposant que vous êtes bien à l'intérieur d'un composant répétitif où #{emp} a été exposée par son var vous pouvez simplement le saisir dans la portée EL à l'intérieur de l'écouteur de changement de valeur, comme suit :

FacesContext context = FacesContext.getCurrentInstance();
Employee employee = context.getApplication().evaluateExpressionGet(context, "#{emp}", Employee.class);
Long id = employee.getId();
// ...

Alternativement, si vous enveloppez le value de la <h:dataTable> à l'intérieur d'un DataModel<Employee> alors vous pouvez obtenir la ligne actuelle comme suit :

Employee employee = model.getRowData();
Long id = employee.getId();
// ...

Sans rapport au problème concret, il est inutile d'avoir deux méthodes d'écoute pour le changement de valeur. Notez que la méthode valueChangeListener vous donne la possibilité d'obtenir l'ancienne et la nouvelle valeur par l'événement et le p:ajax listener non, la nouvelle valeur est déjà définie comme valeur du modèle à ce moment-là. Si vous avez besoin de l'ancienne et de la nouvelle valeur, supprimez la balise listener l'attribut de <p:ajax> . Le site event="valueChange" est d'ailleurs déjà l'événement par défaut, il suffit donc de le supprimer également.

5voto

djmj Points 2251

En utilisant primefaces ajax, vous pouvez récupérer la valeur d'une entrée en java :

public void onValueChanged(AjaxBehaviorEvent event)
{
    Employee employee = (Employee)((UIOutput)event.getSource()).getValue();
    //...
}

<h:selectOneMenu required="true"
    value="#{empl}" converter="#{bean.employeeConverter}">
    <f:selectItems value="#{bean.employees}" var="varEmployee" 
        itemLabel="#{varEmployee}" itemValue="#{varEmployee}"/>
    <p:ajax event="change" listener="#{bean.onValueChanged}"/>
</h:selectOneMenu>

Au lieu de faire un casting vers employee, vous faites un cast vers String puisque votre valeur est un String, ou vous utilisez l'objet employee et vous utilisez un Converter ou sa méthode toString().

2voto

Kragh Points 355

Essayez

<p:ajax event="save" onsuccess="#{employeeController.saveName(emp.id)}"/>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X