2015-03-29 64 views
6

Otrzymuję ten błąd z nieznanych przyczyn podczas próby wprowadzenia kodu ładującego AJAX Spinner.AngularJS Interceptor TypeError: Nie można odczytać nagłówków właściwości o niezdefiniowanym

Nie rozumiem, gdzie powinien zostać zdefiniowany nagłówek. Zrobiłem console.log(config), ale widzę tam wartość headers: accept: text/html.

Poniżej jest mój kod:

/** 
* Spinner Service 
*/ 

//Spinner Constants 
diary.constant('START_REQUEST','START_REQUEST'); 
diary.constant('END_REQUEST','END_REQUEST'); 

//Register the interceptor service 
diary.factory('ajaxInterceptor', ['$injector','START_REQUEST', 'END_REQUEST', function ($injector, START_REQUEST, END_REQUEST) { 
    var $http, 
    $rootScope, 
    myAjaxInterceptor = { 
     request: function (config) { 
      $http = $http || $injector.get('$http'); 
      if ($http.pendingRequests.length < 1) { 
       console.log(config); 
       $rootScope = $rootScope || $injector.get('$rootScope'); 
       $rootScope.$broadcast(START_REQUEST); 
      } 
     } 
    }; 

    return myAjaxInterceptor; 
}]); 

diary.config(['$httpProvider', function ($httpProvider) { 
    $httpProvider.interceptors.push('ajaxInterceptor'); 
}]); 
+0

na co linia pojawi się ten błąd? – Grundy

+0

Nie Linia numer jest pokaz kątowej ::: ====== TypeError: nie można odczytać „nagłówki” własność undefined dolarów get.serverRequest (angularjs: 9366) w processQueue (angularjs: 13248) w angular.js: 13264 w zakresie. $ Get.Scope. $ Eval (angular.js: 14466) w zakresie. $ Get.Scope. $ Digest (angular.js: 14282) w zakresie. get.Scope. $ apply (angular.js: 14571) przy bootstrapApply (angular.js: 1455) w Object.invoke (angular.js: 4203) w doBootstrap (angular.js: 1453) przy bootstrap (kątowy .js: 1473) – ChanX

Odpowiedz

0

Tutaj masz pełną próbkę o tym, jak wdrożyć przy użyciu tarczy przechwytujących (owijanie $ rootScope w służbie dla lepszej czytelności kodu).

http://lemoncode.net/2013/07/31/angularjs-found-great-solution-to-display-ajax-spinner-loading-widget/

Jak podkreślił, to jest przestarzałe (mam zaktualizować POST), obecna struktura używam (uproszczony kod wewnętrzny). Myślę, że może być najlepiej zacząć od plunker, może to nie ma nic wspólnego ze sposobem tou są wykonawczego (pozwól mi szukać plunkr nasion)

myapp.factory('httpInterceptor', ['$q', '$injector', 
    function ($q, $injector) { 

    return { 
     'request': function(config) { 
     // request your $rootscope messaging should be here? 
     return config; 
     }, 

    'requestError': function(rejection) { 
     // request error your $rootscope messagin should be here? 
     return $q.reject(rejection); 
     }, 


     'response': function(response) { 
     // response your $rootscope messagin should be here? 

     return response; 
     }, 

    'responseError': function(rejection) { 
     // response error your $rootscope messagin should be here? 

     return $q.reject(rejection); 

     } 
    }; 
    } 
]); 
+0

wspomniany tutorial wewnątrz posta na blogu jest nieaktualny. Właściwie śledziłem wpis na początku, ale później dowiedziałem się, że $ httpProviders.responseInterceptors jest przestarzałe .. Używam kątowego 1.3.15 – ChanX

+0

Mmm ... przepraszam za to, sprawdzając kod jaki mam w bardziej zaktualizowanych projektach Używam $ httpProvider.interceptors. push ("httpInterceptor") ;, a ta metoda ma żądanie "public", "requestError" i "reponseError", czy mam wkleić tę usługę? – Braulio

+0

Próbowałem tej metody .. W rzeczywistości moja metoda powyżej opiera się na tym .. Ale nagłówki właściwości niezdefiniowany błąd .. W każdym razie możesz wkleić tę usługę .. – ChanX

12

Chyba mam rozwiązanie.

Miałem ten sam problem w ramach projektu angularjs gdzie Interceptor jest dokładnie zdefiniowane takie same (https://docs.angularjs.org/api/ng/service/$http#interceptors)

Aby skrócić An połowów przy Interceptor config i musiał go zwrócić. I zapomniałeś.

Więc to byłoby:

request: function (config) { 
    $http = $http || $injector.get('$http'); 
    if ($http.pendingRequests.length < 1) { 
     $rootScope = $rootScope || $injector.get('$rootScope'); 
     $rootScope.$broadcast(START_REQUEST); 
    } 
    return config; 
}