0

Primefaces 3.4.2 で JSF 2.0 を使用しています

親の値に基づいて、最初の1つの親と2番目の子の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>

1つの引数を持つloadDepartmentsと呼ばれる部門ManagedBeanにメソッドがあります

public void loadDepartments(String employeeNumber)

親コンポーネントで選択されたコードに基づいてすべての部門をロードするように、子コンポーネントの loadDepartments に値を渡すにはどうすればよいですか?

私が代用 している場合、私#{deptMB.loadDepartments(empMB.employee.employeeCode)}は得ています

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

非常に価値のあるヘルプはありますか?

4

1 に答える 1

4

私はこれをします:

  1. リスト変数を Bean (および適切なゲッター) に追加します。このリストは、子コンボ ボックスの値を保持します。
  2. 親コンボ ボックスの p:ajax 呼び出しにリスナーを追加します。リスナーは子の値のリストを設定します (リスナー内の選択された親項目にアクセスできます)。と
  3. 呼び出しようとしている loadDepartments メソッドの代わりに、手順 1 で作成したリストの値を使用するように xhtml を更新します。

これは通常、私がこの種のことを行う方法であり、あなたにとってはうまくいくはずです.

編集

ページのコード:

<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 に答える