2012-08-02 17 views

cevap

12

this thread'a bir göz atın, bu tür şeyleri eklemek için $httpProvider.responseInterceptors gibi görünüyor.

This fiddle ajax istekleri için bir döndürücüyü başlatmak/durdurmak için kodun nereye ekleneceği konusunda iyi bir örnek gösterir. This fiddle benzer ancak aslında bir 'Yükleme ...' divini gösterir ve gizler.

yalnızca görünümleri content-typethis postapplication/json gösterileri ne benzer text/html eşit olduğunda Sizin/sizin başlangıç ​​sınırlamak kodunu durduramaz değiştirdiğinizde bir değer değiştirici göstermek istiyorsanız

.

Not: Testlerimde, spinnerFunction'daki headersGetter()['Content-Type'], .html dosyaları alırken göz ardı edilirken servis çağrıları yapılırken doldurulur.

+0

Mükemmel. Sadece ihtiyacım olan şey. Teşekkür ederim :) – matsko

+0

Bu sadece tek bir ajax isteğiniz varsa çalışır. – Meeker

+0

Bu akım 1.2 için mi? – ericpeters0n

9

AngularJS $http.pendingRequests.length çağrısını kullanmak daha kolay, uyarlanabilir bir yaklaşım olacağını düşünüyorum. Bekleyen ajax çağrı sayısını döndürür. Yani, 0 ulaştığı zaman, sayfa yükleme işlemi bitti.

Herhangi bir öğeye bir yükleme div (scrim) ekleyen bir yönerge oluşturabilir ve daha sonra tüm ajax çağrılarının çözülmesini ve daha sonra döndürücünüzün çıkarılmasını bekleyebilirsiniz.

 // 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"); 
      } 
     }); 

$ .active belgelenmemiş, unutmayın:

İşte angularjs yönergesine yapmak için kod bir et.

+0

Teşekkürler bunun için teşekkürler! ~ – matsko

+0

Her zaman :) Sadece birkaç saat boyunca başımı çarptım ve paylaşacağımı düşündüm. – Stone

+0

BTW ayrıca 'setTimeout' kullanılmadan aynı etkiyi elde etmek için' $ scope. $ Watch' kullanabilirsiniz. Bu, kapsam kapsamı sindirimleriyle birlikte ilerlediğinden daha iyi bir seçim olacaktır. Bu eklentiyi de kullanabilirsiniz, ancak işiniz bittiğinde manuel olarak "$ scope.onReady()" işlevini çağırmanız gerekir. https://github.com/yearofmoo/AngularJS-Scope.onReady – matsko

İlgili konular