0

我正在使用 JSF 2.0 和 Primefaces 3.4.2

我有两个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})} 

任何帮助是非常可观的?

4

1 回答 1

4

我会这样做:

  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);
}
...
}

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

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

}
于 2013-02-20T18:10:11.790 回答