Pregunta Primefaces valueChangeListener o

Esta pregunta ya tiene una respuesta aquí:

Estoy usando Primefaces 3.4.2.

Tengo lo siguiente en mi página 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>

y en ManagedBean

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

El problema es valueChangeListener no está disparando, es decir handleChange método no está siendo invocado. Intenté con lo siguiente, pero tampoco funciona.

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

Separar la página 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>

17
2018-02-19 11:23


origen


Respuestas:


Si quieres usar valueChangeListener, debe enviar el formulario cada vez que elija una nueva opción. Algo como esto:

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

O bien, si quieres usar <p:ajax>, Debe tener un aspecto como este:

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

Una cosa a tener en cuenta es que en su código de ejemplo, vi que el value atributo de su <p:selectOneMenu> es #{mymb.employeesList} que es lo mismo que value de <f:selectItems>. los value de tu <p:selectOneMenu> debería ser similar a mis ejemplos anteriores que apuntan a un solo empleado, no a una lista de empleados.


44
2018-02-19 20:22



los valueChangeListener solo es necesario, si está interesado tanto en el viejo y el nuevo valor

Si solo está interesado en el nuevo valor, el uso de <p:ajax> o <f:ajax> es la mejor opción

Hay varias razones posibles por las que la llamada ajax no funcionará. Primero debe cambiar la firma del método del método del manejador: soltar el parámetro. Luego puede acceder a la variable de bean administrada directamente:

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

En ese momento, se llama al oyente, el nuevo valor ya está establecido. (Tenga en cuenta que supongo implícitamente que la expresión el mymb.emp.employeeName está respaldado correctamente por los métodos getter / setter correspondientes).


16
2018-02-19 12:15



<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
2018-05-14 14:21



Otra solución es mezclar valueChangeListener, ajax y procesar:

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

El método en mybean es simplemente:

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

¡Así, valueChangeEvent es muy ligero!

PD: Funciona bien con PrimeFaces 5.0


10
2017-08-19 18:55



Todo se puede definir como en f:ajax attiributes.

es decir

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

evento: puede ser eventos normales de DOM como click, o valueChange

ejecutar: Esta es una lista separada por espacios de identificadores de los componentes de los clientes que participarán en la parte de "ejecución" del ciclo de vida del proceso de solicitud.

hacer: Los clientes de los componentes que participarán en la parte de "procesamiento" del ciclo de vida de procesamiento de solicitudes. Una vez realizada la acción, puede definir qué componentes se deben actualizar. Id, IdList o estas palabras clave se pueden agregar: @this, @form, @all, @none.

Puede acceder a toda la lista de atributos siguiendo el siguiente enlace: http://docs.oracle.com/javaee/6/javaserverfaces/2.1/docs/vdldocs/facelets/f/ajax.html


4
2018-01-19 09:37



Intenta usar p: ajax con el atributo de evento,


2
2018-02-21 05:10



Mi problema era que estábamos usando securyty de primavera, y la página anterior no llama a la página usando faces-redirect = true, luego la página muestra una advertencia de java, y el control no activa el evento de cambio.

Solución: La página anterior debe llamar a la página usando, faces-redirect = true


2
2018-03-31 18:42