Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从属p:SelectOne菜单值填充_Java_Jsf_Jsf 2_Primefaces - Fatal编程技术网

Java 从属p:SelectOne菜单值填充

Java 从属p:SelectOne菜单值填充,java,jsf,jsf-2,primefaces,Java,Jsf,Jsf 2,Primefaces,我正在使用JSF2.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}" ite

我正在使用JSF2.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 id="department" value="#{deptMB.department}">
<f:selectItems value="#{deptMB.loadDepartments(<??>)}" var="dept"
itemLabel="#{dept.departmentName}" itemValue="#{dept.departmentCode}"/>
                </p:selectOneMenu>
我在department ManagedBean中有一个名为loadDepartments的方法,只有一个参数

public void loadDepartments(String employeeNumber)
如何将值传递给子组件中的loadDepartments,以便它根据在父组件中选择的代码加载所有部门

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

Error Parsing: #{deptMB.loadDepartments({empMB.employee.employeeCode})} 
任何帮助都是非常值得的?

我会这样做:

  • 向bean(和相应的getter)添加一个列表变量:该列表将保存子组合框的值
  • 在父组合框上的p:ajax调用中添加一个侦听器:侦听器填充子值列表(您将有权访问其侦听器中选定的父项);及
  • 更新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(和相应的getter)添加一个列表变量:该列表将保存子组合框的值
  • 在父组合框上的p:ajax调用中添加一个侦听器:侦听器填充子值列表(您将有权访问其侦听器中选定的父项);及
  • 更新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>
    

    该错误表示您正在嵌入EL(在另一个“{}”中嵌入“{}”)。EL将处理“#{}”中的所有内容,因此不需要额外的大括号。除此之外,你正在尝试的不是一个好的设计。安德烈的答案是更好的方法。预填充支持bean列表并将其绑定到
    empMB
    中的
    ,而不是
    private Employee Employee
    ,使用
    private String employeeNumber
    并将其用作第一个
    selectOneMenu
    的值。然后您可以执行
    错误指示您正在嵌入EL(在另一个“{}”中包含“{}”)。EL将处理“#{}”中的所有内容,因此不需要额外的大括号。除此之外,你正在尝试的不是一个好的设计。安德烈的答案是更好的方法。预填充支持bean列表并将其绑定到
    empMB
    中的
    ,而不是
    private Employee Employee
    ,使用
    private String employeeNumber
    并将其用作第一个
    selectOneMenu
    的值。然后你可以做
    ,我觉得这很简单,不需要它,特别是考虑到提问者的声誉,他似乎是一个知识渊博的人。但你说得有道理。我会编辑一下答案。@Andre如果你能提供一些片段,我将不胜感激。@Polppan完成了。。。以此为起点,如果您需要进一步了解,请告诉我help@Andre在我开始之前,我需要一个转换器类吗?@Polppan是的,你需要。我没有把它添加到代码中,因为你的问题没有。我的错。你也需要帮助吗?我想这很简单,不需要它,特别是考虑到提问者的声誉,他似乎是一个知识渊博的人。但你说得有道理。我会编辑一下答案。@Andre如果你能提供一些片段,我将不胜感激。@Polppan完成了。。。以此为起点,如果您需要进一步了解,请告诉我help@Andre在我开始之前,我需要一个转换器类吗?@Polppan是的,你需要。我没有把它添加到代码中,因为你的问题没有。我的错。你也需要帮忙吗?
    @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
        }
    
    }