我在inputtext中显示了一个Employee对象。例如,员工的名字显示在输入文本中。当这个名字的值改变时,它会调用一个方法。在这之前,我想调用一个方法,将员工的ID保存在managedbean中,这样我就知道需要更改哪个员工。我该如何做到这一点,到目前为止我已经做到了:
<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>
我想我应该用onValueChangedStart或firstNameChanged方法传递ID。我该怎么做?或者有更好的方法吗?emp有一个积极进取的人。所以#{emp}.id来获取它。
假设您确实在#{emp}
由其var
属性公开的重复组件内,您可以从值更改侦听器内的EL范围中获取它,如下所示:
FacesContext context = FacesContext.getCurrentInstance();
Employee employee = context.getApplication().evaluateExpressionGet(context, "#{emp}", Employee.class);
Long id = employee.getId();
// ...
或者,如果将<h:dataTable>
的value
封装在DataModel<Employee>
中,则可以获得当前行,如下所示:
Employee employee = model.getRowData();
Long id = employee.getId();
// ...
与具体问题无关,没有必要为值更改设置两个侦听器方法。请注意,valueChangeListener
使您有机会通过事件获得旧值和新值,而p:ajax listener
则不然,此时新值已设置为模型值。如果同时需要旧值和新值,请删除<p:ajax>
的listener
属性。顺便说一句,event="valueChange"
已经是默认事件了,所以也可以删除它。
使用primefaces ajax,您可以在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>
由于您的值是String,所以您不必强制转换为employee,而是强制转换为String,或者使用employeeObject并使用Converter或其toString()方法。
尝试
<p:ajax event="save" onsuccess="#{employeeController.saveName(emp.id)}"/>