2011-12-06 36 views
18

tengo algo como:caso PrimeFaces keyup retrasar

<p:inputText...> 
    <p:ajax event="keyup" update="somefield" listener="#{someBean.doSomething}"/> 
</p:inputText> 

Pero no quiero hacer una petición Ajax en cada pulsación de tecla, me gustaría hacer la solicitud de medio segundo después de que el usuario deja de escribir.

he visto este problema resuelto en jQuery en otra pregunta: How to delay the .keyup() handler until the user stops typing?

me gustaría saber si es posible hacer esto en PrimeFaces o cómo adaptar la solución de la cuestión de jQuery.
Estoy usando PrimeFaces 3.0.M4.
Gracias de antemano.

Respuesta

17

¿Por qué no utiliza el componente PrimeFaces 'RemoteCommand?

Le da una función global de Javascript, que puede llamar desde cualquier lugar siempre que lo desee. Y le permite llamar al método managed-bean y tiene el atributo update para la actualización parcial.

<p:inputText id="input" /> 

<h:form> 
    <p:remoteCommand name="sendAjaxical" update="somefield" action="#{someBean.doSomething}"/> 
</h:form> 

Registro controlador de eventos, que tomó prestado lo siguiente de the same answer you posted:

var delay = (function() { 
    var timer = 0; 
    return function(callback, ms) { 
     clearTimeout (timer); 
     timer = setTimeout(callback, ms); 
    }; 
})(); 


jQuery("#input").keyup(function() { 
    delay(function() { sendAjaxical(); }, 2000); //sendAjaxical is the name of remote-command 
}); 
+1

Esto funcionó muy bien, no sabía acerca de remoteComand. Tenía que reemplazar la parte jQuery del guión con algo como: ajaxDelay función '() { retardo (function() {sendAjaxical();}, 2000);}' y llamarlo como esto '

' ¡Muchas gracias! – Roteke

+0

Me alegro de que haya ayudado. –

2

No puede utilizar Primefaces Ajax Component, si elige la solución jquery/javascript. Tendría que implementar su propia función javascript (con soporte para ajax/xmlHttpRequest) y activar esa función luego de medio segundo.

Pero hay otra solución, una solución alternativa: Se podría utilizar un componente autocompletar y utilizar atributos 3 votos: valueChangeListener (A method expression that refers to a method for handling a valuchangeevent - se utiliza en lugar de que completeMethod porque no es necesario las sugerencias que regresan), queryDelay (Delay to wait in milliseconds before sending each query to the server) y minQueryLength (Number of characters to be typed before starting to query - si no desea iniciar la solicitud de ajax después de haber escrito un solo carácter).

Espero que encuentre interesante esta solución ... Consulte el componente autocompletar en acción aquí (http://www.primefaces.org/showcase-labs/ui/autocompleteHome.jsf) y puede encontrar más información leyendo la Guía del usuario Primefaces para 3.0.M4.

+0

+1 solución Neat! –

+0

Esto funcionó para llamar al método bean con el retraso que quería, pero no tiene la actualización (que necesito), y tampoco lo hace el envío del valor en el momento en que se ejecuta valueChangeListener. Pero la respuesta me ayudó a encontrar otras soluciones. Muchas gracias. – Roteke

1

Un truco rápido sería la adición de un retraso en onstart del p:ajax. Definir la siguiente función en algún lugar de su javascript:

function keyupDelay(request, cfg, delay) { 
    delay = delay || 2000;// if no delay supplied, two seconds are the default seconds between ajax requests 
    setTimeout(function() { 
     cfg.onstart = null; 
     request.send(cfg) 
    }, delay); 
    return false; 
} 

Básicamente esa función activa la petición Ajax en un determinado tiempo de espera mientras regresaba falsa para el inmediato y el vaciado de la OnStart sobre dicha solicitud timedout a fin de no atrapado en una lazo desagradable.

Luego, en el p:ajax:

<p:ajax event="keyup" onstart="return keyupDelay(this, cfg)" /> 

El retraso parámetro es opcional aquí, por defecto es 2 segundos.

11

Si usa Primefaces 5.x, hay un atributo delay en la etiqueta p:ajax para este propósito.Así se hace así:

<p:inputText...> 
    <p:ajax event="keyup" delay="1000" listener="#{someBean.doSomething}" 
     update="somefield" process="@this" /> 
</p:inputText> 

Si no, usted podría lograrlo usando f:ajax en lugar de p:ajax (sí, funciona con p:inputText, también). f:ajax ha agregado soporte para queue control a partir de JSF 2.2. Por lo que el código es el siguiente:

<p:inputText...> 
    <f:ajax event="keyup" delay="1000" listener="#{someBean.doSomething}" 
     render="somefield" execute="@this" /> 
</p:inputText> 

Ver también:

+0

¿'f: ajax' admite todos los eventos que tiene cada componente de PrimeFaces, o hay limitaciones? – Kukeltje

+0

@Kukeltje, no estoy seguro de eso. Teóricamente, 'p: ajax' es una implementación más potente, pero los componentes también deberían funcionar con' f: ajax'. De todos modos, esta respuesta es la única desventaja de no usar 'f: ajax' en este caso concreto, IMO. –

+0

¿Intentó agregar 'demora' a 'p: ajax' a? Según los documentos, existe. – Kukeltje