web-dev-qa-db-ger.com

Primes valueChangeListener oder <p: ajax-Listener, der nicht für p: selectOneMenu ausgelöst wird

Ich verwende Primefaces 3.4.2.

Ich habe auf meiner JSF-Seite Folgendes:

<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>

und in ManagedBean

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

Das Problem ist, dass valueChangeListener nicht ausgelöst wird, d. H. handleChange-Methode wird nicht aufgerufen. Ich habe es mit dem folgenden probiert, aber es funktioniert auch nicht.

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

Separate JSF-Seite:

<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

Wenn Sie valueChangeListener verwenden möchten, müssen Sie das Formular jedes Mal absenden, wenn eine neue Option ausgewählt wird. Etwas wie das:

<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());
}

Oder wenn Sie <p:ajax> verwenden möchten, sollte es so aussehen:

<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);
}

Zu beachten ist, dass ich in Ihrem Beispielcode gesehen habe, dass das value-Attribut Ihres <p:selectOneMenu>#{mymb.employeesList} ist, das dem value von <f:selectItems> entspricht. Die value Ihres <p:selectOneMenu> sollte ähnlich zu meinen obigen Beispielen sein, die auf einen einzelnen Mitarbeiter und nicht auf eine Liste von Mitarbeitern verweisen.

46
Mr.J4mes

Die valueChangeListener ist nur notwendig, wenn Sie sich für den alten und für den neuen Wert interessieren.

Wenn Sie nur an dem neuen Wert interessiert sind, ist die Verwendung von <p:ajax> oder <f:ajax> die bessere Wahl.

Es gibt mehrere mögliche Gründe, warum der Ajax-Aufruf nicht funktioniert. Zuerst sollten Sie die Methodensignatur der Handler-Methode ändern: Löschen Sie den Parameter. Dann können Sie direkt auf Ihre verwaltete Bean-Variable zugreifen:

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

Wenn der Listener aufgerufen wird, ist der neue Wert bereits festgelegt. (Beachten Sie, dass ich implizit davon ausgehe, dass der el-Ausdruck mymb.emp.employeeName durch die entsprechenden Getter/Setter-Methoden korrekt gesichert wird.)

16
Matt Handy

Eine andere Lösung besteht darin, valueChangeListener, ajax und process zu mischen:

<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>

Methode in mybean ist nur:

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

So ist valueChangeEvent sehr leicht!

PS: Funktioniert gut mit PrimeFaces 5.0

10
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

Alle können wie in f:ajax-Einstellungen definiert werden.

d.h.

    <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: Dies können normale DOM-Ereignisse wie click oder valueChange sein.

execute: Dies ist eine durch Leerzeichen getrennte Liste von Client-IDs von Komponenten, die am "Ausführen" - Teil des Request Processing Lifecycle teilnehmen.

render: Die Client-IDs der Komponenten, die am "Rendering" -Abschnitt des Request Processing Lifecycle teilnehmen werden. Nach Abschluss der Aktion können Sie definieren, welche Komponenten aktualisiert werden sollen. Id, IdList oder diese Schlüsselwörter können hinzugefügt werden: @this, @form, @all, @none.

Sie können die gesamte Attributliste über den folgenden Link anzeigen: http://docs.Oracle.com/javaee/6/javaserverfaces/2.1/docs/vdldocs/facelets/f/ajax.html

4
efirat

Versuchen Sie es mit p: ajax mit dem Ereignisattribut

2
Sandeep Goud

Mein Problem war, dass wir Spring Securyty verwendet haben und die vorherige Seite die Seite nicht mit faces-redirect = true aufruft. Dann wird auf der Seite eine Java-Warnung angezeigt und das Steuerelement löst das Änderungsereignis nicht aus. 

Lösung: Die vorherige Seite muss die Seite mit faces-redirect = true aufrufen

2
Edgar Diaz

das funktioniert für mich:

Es kann innerhalb des Dialogs verwendet werden, aber der Dialog darf sich nicht in Komponenten wie Panels, Akkordeons usw. befinden.

0
Geo