2016-06-13 13 views
4

Wie man eine Verzögerung (300ms zum Beispiel) hinzufügt, wenn der AjaxStatus der Primefaces angezeigt wird. Im Moment wird es immer sofort angezeigt, wenn eine Ajax-Anfrage aussteht. Dies ist zum Beispiel bei "onkeyUp" -Ereignissen mühsam, wenn jeder Tastenanschlag den Ladedialog für einen Bruchteil einer Sekunde heraufbringt.Wie verzögert man Primefaces AjaxStatus auf JSF?

Hier ist meine AjaxStatus Ladeanzeigekomponente.

<p:ajaxStatus id="startAjax" onstart="PF('start').show();" oncomplete="PF('start').hide();" > 
</p:ajaxStatus> 

<p:dialog widgetVar="start" showHeader="false" resizable="false"> 
    <h:graphicImage value="#{resource['/images/loading.gif']}"></h:graphicImage> 
</p:dialog> 
+0

Sie primefaces Erweiterung verwenden können '' und rufen ajaxStatus von Timer oder 'onShow' Eigenschaft gibt es in' ' erhältlich von Timer aufrufen denen tue nichts, warte nur und dann wird die Steuerung zurück zum Dialog und ajaxStatus wird angezeigt. – techipank

+0

@techipank, es scheint, dass pe: timer ist veraltet. Ich füge Primefaces-Erweiterungen zu maven-Abhängigkeiten und dem Namespace xmlns hinzu: pe = "http://primefaces.org/ui/extensions" und pe: bietet nur Timeline- und Timepickerkomponenten an. Es gibt keinen Timer. Vielleicht wäre auch geeignet. –

+1

Mit Ihrer eigenen Javascript-Funktion: 'onstart =" myStart ('start') "' und in 'function myStart (pfo) {' benutzen Sie 'window.setTimeout()' zum Aufruf von 'PF (pfo) .show() ' – Holger

Antwort

6

Sie benötigen PF wickeln (‚Start‘) starten() mit einer Funktion, die es mit einer Verzögerung nennen. Außerdem sollte der onComplete-Handler überprüfen, ob der Status "Ausstehend" zum Anzeigen und Abbrechen vorhanden ist. Dies dient dazu, den Fall zu vermeiden, in dem Ajax beendet wurde, bevor der Status angezeigt wurde.

-Code sollte so etwas wie dieses (nicht getestet)

<p:ajaxStatus id = "startAjax" onstart = "startHandler();" oncomplete = "endHandler();"/> 
    <script> 
     var ajaxInProgress; 
     function startHandler() { 
      ajaxInProgress = setTimeout(function() { 
       PF('start').show(); 
      }, 3000); 
     } 
     function endHandler() { 
      clearTimeout(ajaxInProgress); 
      PF('start').hide(); 
      ajaxInProgress = null; 
     } 
    </script> 
+0

Danke. Ich werde das versuchen und Ihre Antwort überprüfen, wenn es korrekt ist. –

+0

Ja, es funktioniert. 400 Millisekunden schienen der ideale Punkt für meine Anwendung zu sein. –