JSF (and PrimeFaces) How to pass parameter to a me

2019-04-13 06:24发布

I have an Employee object I am showing in inputtext. For example, the firstname of the employee is shown in an inputtext. When the value of this firstname changes it calls a method. Before this is done I want to call a method which saves the ID of the employee in the managedbean so I know which employee needs to be changed. How do I do this, I got this so far:

<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>

I guess I should pass the ID with the onValueChangedStart or firstNameChanged method. How do I do this? Or is there a better way to do this? There is a getter for the emp. So #{emp}.id to get it.

3条回答
Lonely孤独者°
2楼-- · 2019-04-13 06:47

try

<p:ajax event="save" onsuccess="#{employeeController.saveName(emp.id)}"/>
查看更多
走好不送
3楼-- · 2019-04-13 07:04

Assuming that you're indeed inside a repeating component where #{emp} is been exposed by its var attribute, you could just grab it from the EL scope inside the value change listener as follows:

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

Alternatively, if you wrap the value of the <h:dataTable> inside a DataModel<Employee>, then you can obtain the current row as follows:

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

Unrelated to the concrete problem, it's unnecessary to have two listener methods for the value change. Note that the valueChangeListener gives you the opportunity to get both the old and new value by the event and the p:ajax listener not, the new value is already been set as model value at that point. If you need both the old and new value, remove the listener attribute of <p:ajax>. The event="valueChange" is by the way the default event already, so just remove it as well.

查看更多
一夜七次
4楼-- · 2019-04-13 07:04

Using primefaces ajax you can retrieve the value of an input in java doing:

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>

Instead of casting to employee you cast to String since your value is a String, or use the employee Object and use a Converter or its toString() method.

查看更多
登录 后发表回答