2012-08-02 18 views

Respuesta

12

Eche un vistazo a this thread Parece que el $httpProvider.responseInterceptors es un buen lugar para agregar este tipo de cosas.

This fiddle muestra un buen ejemplo de dónde agregar código para iniciar/detener un spinner para solicitudes ajax. This fiddle es similar pero en realidad muestra y oculta una div 'Cargando ...'.

Si sólo desea mostrar un spinner cuando las opiniones cambian puede limitar su arranque/parada código para cuando content-type es igual a text/html similar a lo que muestra con this postapplication/json.

Nota: en mis pruebas, parece que el headersGetter()['Content-Type'] en el spinnerFunction se omite al recuperar mis archivos .html, mientras que se rellena al realizar llamadas de servicio.

+0

Perfecto. Justo lo que necesito. Gracias :) – matsko

+0

Esto solo funciona si tienes una sola solicitud de Ajax. – Meeker

+0

¿Es esto actual para 1.2? – ericpeters0n

9

Creo que un enfoque mucho más simple y adaptable sería utilizar la llamada AngularJS $http.pendingRequests.length. Devuelve el conteo de llamadas ajax pendientes. Entonces cuando llega al 0, la página está lista para cargarse.

Puede crear una directiva que inserta un div de carga (scrim) en cualquier elemento y luego espera a que todas las llamadas ajax se resuelvan y luego quita su spinner.

Aquí está la carne del código para hacer que sus AngularJS Directiva:

 // Prepend the loading div to the dom element that this directive is applied. 
     var scrim = $('<div id="loading"></div>'); 
     $(scrim).prependTo(domElement); 

     /** 
     * returns the number of active ajax requests (angular + jquery) 
     * $.active returns the count of jQuery specific unresolved ajax calls. It becomes 0 if 
     * there are no calls to be made or when calls become finished. 
     * @return number of active requests. 
     */ 
     function totalActiveAjaxRequests() { 
      return ($http.pendingRequests.length + $.active); 
     } 

     /** 
     * Check for completion of pending Ajax requests. When they're done, 
     * remove the loading screen and show the page data. 
     */ 
     scope.$watch(totalActiveAjaxRequests, function whenActiveAjaxRequestsChange() { 
      if(totalActiveAjaxRequests() === 0){ 
       $log.log("done loading ajax requests"); 
       $(scrim).remove(); 
       $(domElement).css("position", "inherit"); 
      } 
     }); 

Tenga en cuenta, $ .active es indocumentado.

+0

¡Gracias por esto! ~ – matsko

+0

En cualquier momento :) Me acabo de golpear la cabeza durante unas horas y pensé que compartiría. – Stone

+0

BTW también puede usar '$ scope. $ Watch' para lograr el mismo efecto sin el uso de' setTimeout'. Esta sería una mejor opción ya que esto concuerda con los resúmenes de $ scope. También puedes usar este complemento, pero deberías llamar manualmente '$ scope.onReady()' cuando hayas terminado. https://github.com/yearofmoo/AngularJS-Scope.onReady – matsko

Cuestiones relacionadas