【问题标题】:Dependent p:selectOneMenu Population of values依赖 p:selectOneMenu 值的填充
【发布时间】:2013-02-20 12:47:49
【问题描述】:

我正在使用 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})} 

任何帮助都非常可观?

【问题讨论】:

  • 该错误表明您正在嵌入 EL(在另一个“{}”中包含“{}”)。 EL 将处理 "#{}" 中的所有内容,因此您不需要额外的大括号。除此之外,您正在尝试的不是一个好的设计。安德烈的答案是更好的方法。预填充一个支持 bean 列表并将其绑定到 &lt;f:selectItems/&gt;
  • 在您的empMB 中,而不是private Employee employee,使用private String employeeNumber 并将其用作您的第一个selectOneMenu 的值。然后你可以做&lt;f:selectItems value="#{deptMB.loadDepartments(empMB.employeeNumber)}" /&gt;

标签: java jsf jsf-2 primefaces


【解决方案1】:

我会这样做:

  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
    }

}

【讨论】:

  • 我认为不需要它很简单,特别是考虑到提出问题的人的声誉,他似乎是一个知识渊博的人。但你说得有道理。我稍后会编辑答案。
  • @Andre 感谢您提供一些 sn-ps。
  • @Polppan done... 以此为起点,如果您需要进一步帮助,请告诉我
  • @Andre 在我开始之前,我需要一个 Converter 类吗?
  • @Polppan 是的,你知道。我没有将它添加到代码中,因为您的问题没有。我的错。你也需要这方面的帮助吗?
猜你喜欢
  • 2014-11-19
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多