Dependent p:选择OneMenu值的填充



我使用的是带有Primefaces 3.4.2 的JSF 2.0

我有两个p:selectOneMenu,第一个是父级,第二个是子级,根据父级值,填充子组件。

p:selectOneMenu

<p:selectOneMenu id="empl" value="#{empMB.employee}">
<f:selectItems value="#{empMB.employeeList}" var="emp"
itemLabel="#{emp.employeeName}" itemValue="#{emp.employeeNumber}"/>     
                        <p:ajax update="department"  />                      
                    </p:selectOneMenu>

p:selectOneMenu

<p:selectOneMenu id="department" value="#{deptMB.department}">
<f:selectItems value="#{deptMB.loadDepartments(<??>)}" var="dept"
itemLabel="#{dept.departmentName}" itemValue="#{dept.departmentCode}"/>
                </p:selectOneMenu>

我在部门ManagedBean中有一个名为loadDepartments的方法,只有一个参数

public void loadDepartments(String employeeNumber)

如何将值传递给子组件中的loadDepartments,以便它根据父组件中选择的代码加载所有部门?

如果我替换#{deptMB.loadDepartments(empMB.employee.employeeCode)},我得到

Error Parsing: #{deptMB.loadDepartments({empMB.employee.employeeCode})} 

有什么帮助是非常可观的吗?

我会这样做:

  1. 向您的bean(以及适当的getter)添加一个列表变量:这个列表将包含子组合框的值
  2. 在父组合框上的p:ajax调用中添加一个监听器:监听器填充子值列表(您可以访问其监听器中所选的父项);以及
  3. 更新xhtml以使用在步骤1中创建的列表中的值,而不是尝试调用的loadDepartments方法

这通常是我做这类事情的方式,它应该对你有用。

编辑

页面代码:

<p:selectOneMenu id="empl" value="#{empMB.employee}" converter="#{employeeConverter}">
<f:selectItems value="#{empMB.employeeList}" var="emp" itemLabel="#{emp.employeeName}" itemValue="#{emp.employeeNumber}"/>     
    <p:ajax update="department" listener="#{empMB.onEmployeeSelect}" process="@this"/>                      
</p:selectOneMenu>
<p:selectOneMenu id="department" value="#{deptMB.department}" converter="#{departmentConverter}">
    <f:selectItems value="#{empMB.departmentList}" var="dept" itemLabel="#{dept.departmentName}" itemValue="#{dept.departmentCode}"/>
</p:selectOneMenu>

bean的代码段:

public class EmpMB{
...
private List<Department> departmentList;
private Employee employee;
public List getDepartmentList(){
    return departmentList;
}
public void onEmployeeSelect(){
    departmentList = someService.getDepartmentsForEmployee(employee);
}
...
}

转换器示例(注意,它是一个spring组件,因此我可以将我的服务层注入其中,但您不必这样做):

@Component("employeeConverter")
public class EmployeeConverter implements Converter {
    @Override
    public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
        //TODO: implement this
    }
    @Override
    public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {
        //TODO: implement this
    }
}

相关内容

  • 没有找到相关文章

最新更新