[Resolvido]RichFaces - PhaseListiner previnir multiplos cliques

2 respostas
P

Olá,

Estou desenvolvendo um PhaseListiner para previnir multiplos cliques no menu, e outras partes da aplicação. O grande problema está que quando eu chamo a ação:

facesContext.responseComplete();

O a4j:status nunca para, em qualquer outro momento da aplicação ele funciona corretamente, apenas quando eu chamo essa instrução o componente continua executando. Mesmo chamando outra requisição ajax
ele continua executando.

Alguem sabe alguma forma de eu conseguir dar um abort(); no Ajax? Ou conseguir forçar a parada do a4j:status?

<a4j:status>
		    <f:facet name="start">
		        <h:graphicImage  value="imagens/#{telaPrincipal.pastaSkinPersonalizada}/loader4.gif" style="position: absolute; left:450px; top: 120px;" />
		    </f:facet>
		</a4j:status>
public class MultipleClickPreventionPhaseListener implements PhaseListener {

	private static Semaphore semaphore = new Semaphore(1);

	public PhaseId getPhaseId() {
		return PhaseId.ANY_PHASE;
	}

	public void beforePhase(PhaseEvent phaseEvent) {

		FacesContext facesContext = phaseEvent.getFacesContext();

		if (phaseEvent.getPhaseId().equals(PhaseId.RESTORE_VIEW)) {
			if (!semaphore.tryAcquire()) {
				facesContext.responseComplete();
			}
		}
	}

	public void afterPhase(PhaseEvent phaseEvent) {

		if (phaseEvent.getPhaseId().equals(PhaseId.RENDER_RESPONSE)) {
			if (semaphore.availablePermits() == 0) {
				semaphore.release();
			}
		}

	}

}

2 Respostas

L

Você tem alguma razão específica para usar um PhaseListener para isso? A queue (a4j:queue) do Richfaces não resolve o problema? Além da queue você ainda pode usar o atributo “ignoreDupResponses” para evitar requisição semelhantes.

Maiores informações podem ser encontradas aqui

P

Consegui resolver com o setEventsQueue(“foo”);

valeuuu :smiley:

Criado 7 de dezembro de 2009
Ultima resposta 7 de dez. de 2009
Respostas 2
Participantes 2