2015-06-23 13 views
6

In einer AngularJS-Direktive wird der Parameter templateUrl dynamisch definiert.So verwalten Sie 404 Fehler Laden von Richtlinientemplates in AngularJS

'templates/' + content_id + '.html' 

Ich will nicht, Regeln aufzustellen, zu überprüfen, ob content_id Wert gültig ist und verwalten als 404 Fehler, das heißt, wenn die Vorlage nicht vorhanden ist (Server einen 404-Fehler zurück, wenn die Vorlage laden) Last template/404.html stattdessen.

Wie kann ich das tun?

Bearbeitet: Die aktuellen Antworten schlagen vor, einen Antwortfehler Interzeptor zu verwenden. In diesem Fall - wie kann ich wissen, dass die Antwort auf ein Laden dieser Vorlage ist?

+0

Ich vermute, das wäre besser auf der Server-Seite behandelt werden. – Brandon

+0

Vielleicht, aber ich möchte wissen, wie es geht. – francadaval

Antwort

6

Sie müssen Antwort Interceptor schreiben. Etwas wie folgt aus:

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

Warum die gleiche Antwort eine halbe Stunde nach @ NLN's Antwort hinzufügen? –

+0

@NexusDuck Als ich meine Antwort NLN's hinzugefügt habe, war es nicht so, als würde es jetzt aussehen, es löste ein völlig anderes Problem, als OP gefragt hat. Aber jetzt ist es das gleiche Recht, im Grunde, weil es basierend auf meiner Antwort und meiner Demo aktualisiert wurde :) Überprüfen Sie einfach den Versionsverlauf. – dfsq

+0

Sie haben recht, mein schlechtes –

4

Sie können eine interceptor erstellen, um alle Anfragen zu überwachen, die mit dem $http Service durchgeführt wurden, und etwaige Antwortfehler abzufangen. Wenn Sie für eine Anfrage einen Status 404 erhalten, leiten Sie den Benutzer einfach zur Fehlerseite (template/404.html in Ihrem Fall) um.

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

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

Sie müssten die Abfangjäger $httpProvider in Ihrer Konfigurationsfunktion drücken.

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

Hier ist die demo

Prost!

+1

Dies wird jeden 404 Fehler in xhr abfangen - nicht wahr? Wenn ich also eine andere Direktive erstelle oder verwende, ruft sie, falls diese nicht existiert, 'templates/404.html' auf. – francadaval

+0

@francadaval: Ja, dies wird alle Antwortstatus in allen xhr Anfragen abfangen – nalinc

Verwandte Themen