2012-04-23 62 views
8

Cuando especifico el atributo process de la etiqueta p:ajax, el detector no se ejecuta. Si omito el atributo process, se llama al oyente como se esperaba.PrimeFaces Ajax Listener no se ejecuta cuando el atributo de proceso se especifica para un componente diferente

Aquí es la vista de fragmentos:

<p:messages id="messages" /> 
<h:inputText id="inputToProcess" value="#{controller.inputToProcess}" /> 
<p:selectBooleanCheckbox id="testCheckbox" > 
    <p:ajax event="change" process="inputToProcess" 
    update="messages @this inputToUpdate" 
    listener="#{controller.processChecked}" /> 
</p:selectBooleanCheckbox> 
<h:inputText id="inputToUpdate" value="#{controller.inputToUpdate}" /> 

y regulador:

@javax.faces.bean.ManagedBean 
@javax.faces.bean.ViewScoped 
public class Controller implements Serializable { 
    private String inputToProcess; 
    private String inputToUpdate; 
    //getters and setters 

    public void processChecked(javax.faces.AjaxBehaviorEvent e) { 
    // doing some stuff here 
    } 
} 

Os adjunto un phaseListener a una vista con ANY_PHASEPhaseId, y aquí es lo que he observado.

cuando especifico process atributo, el valor de la entrada inputToProcess se establece con éxito para el controlador durante la fase de actualización de modelo (no se produce ninguna excepción). A continuación, se ejecutan las fases Invoke Application y Render Response, pero no se llama a ningún detector. Una cosa que noté es que la casilla de verificación no está configurada al final. Pero no hay errores de conversión o validación, porque como dije, se ejecutan las fases Update Model y Invoke Application.

Si omito process atributo, esto es lo que veo: el oyente se llama normalmente durante la fase de Invoke Application (ya immediate es false por defecto), y luego `render se ejecuta respuesta. La casilla de verificación se configuró correctamente.

¿Hay alguna explicación para este tipo de comportamiento?

+0

¿Qué sucede si agrega '@ this' a' process'? ¿Qué sucede si usa checkbox JSF estándar y componentes ajax en lugar de los de PrimeFaces? – BalusC

+0

@BalusC Estoy cansado de contar cuántas veces me has ayudado. ¡Gracias una tonelada! Agregar '@ esto' a' proceso' funcionó para mí. ¿Eres capaz de explicar por qué? Pensé que el 'listener' debería activarse sin importar si' @ this' está especificado en 'process' o no. ¿Podría ser esto un problema? El problema con el checkbox JSF estándar y los componentes ajax, es que el oyente se invoca durante la fase 'Validaciones del proceso', ¡pero primero tengo que actualizar el modelo! Anywho, publica esto como respuesta, lo acepto con gusto. – jFrenetic

+0

Se agregó un problema en: https://github.com/primefaces/primefaces/issues/509, pero lamentablemente no quieren solucionarlo. Por favor, entra y comenta y vota sobre ello. – GreenieMeanie

Respuesta

15

Debería funcionar bien a primera vista. Al menos, funciona bien de esa manera cuando se usan componentes estándar JSF. Apuesto a que es un error o "característica" de PrimeFaces que no procesa la acción cuando el componente de acción no está incluido en el process. Agregar @this a process debería resolverlo. Considere publicar un informe de problemas para los chicos de PrimeFaces.

Además, prefiero usar event="valueChange" o event="click" en lugar de event="change" o simplemente quitar la event por completo, el valor predeterminado es el valor correcto ya (valueChange que rendir onclick en componentes de casilla de verificación y botón de radio). El evento change funciona de forma diferente en MSIE para casillas de verificación y botones de radio. Solo se activa en el segundo clic y adelante. No quieres ser dependiente del navegador.


De acuerdo con su comentario:

El problema con los componentes de casilla de verificación y ajax JSF estándar, es que el oyente se invoca durante la fase de validaciones de procesos, pero necesito para actualizar el modelo primero!

Esto no es cierto. Probablemente estaba usando valueChangeListener en lugar de <f:ajax listener> o confundiendo el uno con el otro. El <f:ajax listener> siempre se invoca durante la fase de invocación.

+0

¡Excelente! Tenías razón, usé 'valueChangeListener'. Una última pregunta. Con 'f: ajax', ¿qué evento debo especificar? ¿O tiene el valor correcto al igual que con 'p: ajax'? – jFrenetic

+2

Sí, lo hace. El valor predeterminado siempre es 'event =" valueChange "' para los componentes 'UIInput' y' event = "action" 'para los componentes' UICommand'. En los componentes 'UIInput' se traducirá a' change' para elementos de entrada HTML/select/textarea y para 'click' para elementos de radio HTML/checkbox. – BalusC

+1

Aunque 'process' se establece por defecto en' @ this' como se describe en la documentación de Primefaces, '@ this' sorprendentemente no se procesa si tiene otros identificadores de componente en' process'. –

Cuestiones relacionadas