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>
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
は、従業員のリストではなく、単一の従業員を指す上記の例に似ている必要があります。
valueChangeListener
は、古いand新しい値の両方に関心がある場合にのみ必要です。
新しい値のみに関心がある場合は、<p:ajax>
または <f:ajax>
がより良い選択です。
Ajax呼び出しが機能しない理由はいくつか考えられます。まず、ハンドラーメソッドのメソッドシグネチャを変更する必要があります。パラメーターを削除します。その後、マネージドBean変数に直接アクセスできます。
public void handleChange(){
System.out.println("here "+ getEmp().getEmployeeName());
}
その時点で、リスナーが呼び出され、新しい値がすでに設定されています。 (私は暗黙的にel式mymb.emp.employeeName
は、対応するgetter/setterメソッドによって正しくサポートされています。
別の解決策は、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で正常に動作します
<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();
}
すべては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>
event:click
やvalueChange
などの通常の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
イベント属性でp:ajaxを使用してみてください。
私の問題は、春のセキュリティを使用しており、前のページがfaces-redirect = trueを使用してページを呼び出していない場合、ページにJava警告が表示され、コントロールが変更イベントを発生させます。
解決策:前のページは、faces-redirect = trueを使用してページを呼び出す必要があります
これは私のために働く:
ダイアログ内で使用できますが、ダイアログをパネル、アコーディオンなどのコンポーネント内に配置することはできません。