2015-06-23 9 views
6

W dyrektywie AngularJS parametr templateUrl jest zdefiniowany dinamicznie.Jak zarządzać błędami 404 ładowanie szablonów dyrektyw w AngularJS

'templates/' + content_id + '.html' 

Nie chcę ustanowić przepisy w celu sprawdzenia, czy content_id wartość jest ważna i jak nią zarządzać 404 błędów, czyli jeśli szablon nie istnieje obciążenie template/404.html (serwer podczas ładowania szablonu zwraca błąd 404) zamiast.

Jak mogę to zrobić?

Edytowane: Aktualne odpowiedzi sugerują użycie przechwytywacza błędu odpowiedzi. W takim przypadku, skąd mogę wiedzieć, że odpowiedź dotyczy załadowania tego szablonu?

+0

I podejrzewam, że byłoby lepiej obchodzić na stronie serwera. – Brandon

+0

Może, ale chcę wiedzieć, jak to zrobić. – francadaval

Odpowiedz

6

Będziesz musiał napisać przechwytywacz błędu odpowiedzi. Coś takiego:

app.factory('template404Interceptor', function($injector) { 
    return { 
     responseError: function(response) { 
      if (response.status === 404 && /\.html$/.test(response.config.url)) { 
       response.config.url = '404.html'; 
       return $injector.get('$http')(response.config); 
      } 
      return $q.reject(response); 
     } 
    }; 
}); 

app.config(function($httpProvider) { 
    $httpProvider.interceptors.push('template404Interceptor'); 
}); 

Demo:http://plnkr.co/edit/uCpnT5n0PkWO53PVQmvR?p=preview

+0

Po co dodawać tę samą odpowiedź pół godziny po odpowiedzi @ NLN? –

+0

@NexusDuck Kiedy dodałem swoją odpowiedź NLN nie wyglądało tak, jak teraz wygląda, rozwiązuje zupełnie inny problem niż OP. Ale teraz jest tak samo, głównie dlatego, że został zaktualizowany w oparciu o moją odpowiedź i moje demo :) Po prostu sprawdź historię zmian. – dfsq

+0

Masz rację, mój zły –

4

Można utworzyć interceptor, aby monitorować wszystkie żądania wykonane za pomocą usługi $http i przechwytywać wszelkie błędy odpowiedzi. Jeśli otrzymasz status 404 dla każdego zgłoszonego żądania, po prostu przekieruj użytkownika do strony błędu (template/404.html w twoim przypadku).

.factory('httpRequestInterceptor', function ($q) { 
    return { 
     'responseError': function(rejection) { 
      if(rejection.status === 404){ 
       // do something on error     
      } 

      } 
      return $q.reject(rejection); 
     } 
    }; 
}); 

Będziesz musiał wepchnąć przechwytywacz do $httpProvider w swojej funkcji konfiguracyjnej.

myApp.config(function ($httpProvider, $interpolateProvider, $routeProvider) { 
    $httpProvider.interceptors.push('httpRequestInterceptor'); 
}); 

Oto demo

Cheers!

+1

Spowoduje to przechwycenie dowolnego błędu 404 w xhr ¿nie jest to? Jeśli więc utworzę lub zastosuję inną dyrektywę, na wypadek, gdyby szablon nie istniał, wywoła on 'templates/404.html'. – francadaval

+0

@francadaval: tak, to przechwyci cały status odpowiedzi we wszystkich żądaniach xhr. – nalinc

Powiązane problemy