web-dev-qa-db-ja.com

Primefaces valueChangeListenerまたは<p:ajaxリスナーがp:selectOneMenuに対して起動しない

Primefaces 3.4.2を使用しています。

JSFページに次のものがあります

<p:selectOneMenu id="emp" value="#{mymb.emp.employeeName}" 
        valueChangeListener="#{mymb.handleChange}" 
        required="true"
        style="width: 150px;">
    <f:selectItem noSelectionOption="true" 
            itemLabel="Please  Select"/>
    <f:selectItems value="#{mymb.employeeList}" var="emp"
            itemLabel="#{emp.employeeName}"
            itemValue="#{emp.employeeNumber}"/>
    <p:ajax update="sublist"/>
</p:selectOneMenu>

およびManagedBean

public void handleChange(ValueChangeEvent event){  
    System.out.println("here "+event.getNewValue());
}

問題はvalueChangeListenerが起動しない、つまりhandleChangeメソッドが呼び出されないことです。私は次のことを試してみましたが、どちらも機能していません。

<p:ajax update="sublist"  listener="#{mymb.handleChange}" />  

別のJSFページ:

<ui:composition template="/templates/layout.xhtml"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://Java.Sun.com/jsf/core"
    xmlns:h="http://Java.Sun.com/jsf/html"
    xmlns:ui="http://Java.Sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">
    <ui:define name="content">
        <h:head>
        </h:head>
        <h:body>
            <h:form id="form">                      
                <p:panelGrid columns="6">
                    <h:outputLabel value="Employees" for="employees" />
                    <p:selectOneMenu id="employees"
                            value="#{mymb.employeesList}" 
                            required="true">
                        <f:selectItems value="#{mymb.employeesList}" var="emp"
                                itemLabel="#{emp.employeeName}" />
                        <p:ajax listener="#{mymb.handleChange}"   />  
                    </p:selectOneMenu>                  
                </p:panelGrid>
            </h:form>
        </h:body>
    </ui:define>
</ui:composition>
18
Jåcob

valueChangeListenerを使用する場合は、新しいオプションが選択されるたびにフォームを送信する必要があります。このようなもの:

<p:selectOneMenu value="#{mymb.employee}" onchange="submit()"
                 valueChangeListener="#{mymb.handleChange}" >
    <f:selectItems value="#{mymb.employeesList}" var="emp"
                   itemLabel="#{emp.employeeName}" itemValue="#{emp.employeeID}" />
</p:selectOneMenu>

public void handleChange(ValueChangeEvent event){  
    System.out.println("New value: " + event.getNewValue());
}

または、<p:ajax>を使用する場合は、次のようになります。

<p:selectOneMenu value="#{mymb.employee}" >
    <p:ajax listener="#{mymb.handleChange}" />
    <f:selectItems value="#{mymb.employeesList}" var="emp"
                   itemLabel="#{emp.employeeName}" itemValue="#{emp.employeeID}" />
</p:selectOneMenu>

private String employeeID;

public void handleChange(){  
    System.out.println("New value: " + employee);
}

注意すべきことの1つは、サンプルコードで、<p:selectOneMenu>value属性が#{mymb.employeesList}であり、value of <f:selectItems><p:selectOneMenu>valueは、従業員のリストではなく、単一の従業員を指す上記の例に似ている必要があります。

48
Mr.J4mes

valueChangeListenerは、古いand新しい値の両方に関心がある場合にのみ必要です。

新しい値のみに関心がある場合は、<p:ajax> または <f:ajax>がより良い選択です。

Ajax呼び出しが機能しない理由はいくつか考えられます。まず、ハンドラーメソッドのメソッドシグネチャを変更する必要があります。パラメーターを削除します。その後、マネージドBean変数に直接アクセスできます。

public void handleChange(){  
  System.out.println("here "+ getEmp().getEmployeeName());
}

その時点で、リスナーが呼び出され、新しい値がすでに設定されています。 (私は暗黙的にel式mymb.emp.employeeNameは、対応するgetter/setterメソッドによって正しくサポートされています。

16
Matt Handy

別の解決策は、valueChangeListener、ajax、およびプロセスを混合することです。

<p:selectManyCheckbox id="employees" value="#{employees}" columns="1" layout="grid" valueChangeListener="#{mybean.fireSelection}"   >
    <f:selectItems var="employee" value="#{employeesSI}" />
    <p:ajax event="valueChange" immediate="true" process="@this"/>
</p:selectManyCheckbox>

Mybeanのメソッドは次のとおりです。

public void fireSelection(ValueChangeEvent event) {
    log.debug("New: "+event.getNewValue()+", Old: "+event.getOldValue());
}

このように、valueChangeEventは非常に軽いです!

PS:PrimeFaces 5.0で正常に動作します

11
Emmanuel
<p:ajax listener="#{my.handleChange}" update="id of component that need to be rerender after change" process="@this" />



import javax.faces.component.UIOutput;
import javax.faces.event.AjaxBehaviorEvent;

public void handleChange(AjaxBehaviorEvent vce){  
  String name= (String) ((UIOutput) vce.getSource()).getValue();
}
10
codeFu

すべてはf:ajax属性のように定義できます。

つまり.

    <p:selectOneMenu id="employees" value="#{mymb.employeesList}" required="true">
         <f:selectItems value="#{mymb.employeesList}" var="emp" itemLabel="#{emp.employeeName}" />
         <f:ajax event="valueChange" listener="#{mymb.handleChange}" execute="@this" render="@all" />
    </p:selectOneMenu>

eventclickvalueChangeなどの通常のDOMイベントになります

executeこれは、リクエストの「execute」部分に参加するコンポーネントのクライアントIDのスペース区切りリストです。処理ライフサイクル。

render要求処理ライフサイクルの「レンダリング」部分に参加するコンポーネントのclientId。アクションが完了したら、どのコンポーネントを更新するかを定義できます。 Id、IdList、またはこれらのキーワードを追加できます:@this@form@all@none

次のリンクで属性リスト全体にアクセスできます: http://docs.Oracle.com/javaee/6/javaserverfaces/2.1/docs/vdldocs/facelets/f/ajax.html

5
efirat

イベント属性でp:ajaxを使用してみてください。

2
Sandeep Goud

私の問題は、春のセキュリティを使用しており、前のページがfaces-redirect = trueを使用してページを呼び出していない場合、ページにJava警告が表示され、コントロールが変更イベントを発生させます。

解決策:前のページは、faces-redirect = trueを使用してページを呼び出す必要があります

2
Edgar Diaz

これは私のために働く:

ダイアログ内で使用できますが、ダイアログをパネル、アコーディオンなどのコンポーネント内に配置することはできません。

0
Geo