2013-05-25 14 views
14

Ho un lavoro intercettore angolare:intercettore HTTP angolare eseguito per Embedded NG-modelli

factory('myHttpInterceptor', function ($q, $location, $rootScope) { 
// do something 
return function (promise) { 
    return promise.then(function (response) { 
     // do something 
     return response; 
    }, function (response) { 
     // do something 
     return $q.reject(response); 
    }); 
}; 
}) 

e un unico grande file html che contiene i modelli come <script type="text/ng-template" id="home-template">. Sfortunatamente il mio intercettore HTTP intercetta non solo il caricamento di richieste HTTP ma anche il caricamento di modelli (che sono già caricati in un file html) per controller definiti come when('/', {controller:MainController, templateUrl:'home-template'}). C'è un modo per far sì che l'intercettore intercetti solo le richieste HTTP o come riconoscere se sto caricando qualcosa dal server o solo da un modello?

+0

Non sono sicuro di aver capito la tua domanda. Vuoi intercettare le richieste di modello? o vuoi intercettare tutto tranne le richieste di modello? –

+0

intercetta tutto tranne richieste di modello – igo

risposta

0

Da quello che ho raccolto, si sta cercando un modo per vedere se la richiesta riguardava o meno un file di modello. Quello che potresti fare è guardare lo url della richiesta e vedere se contiene il percorso della tua directory dei parziali.

farmi sapere se questo è ciò che stavate cercando:

var interceptor = ['$location', '$log', '$q', function($location, $log, $q) { 
    function success(response) { 
     // you can examine the url of the request here 
     $log.info(response.config.url) 
     return response; 
    } 

    function error(response) { 
     if (response.status === 401) { 
      $location.path('/signin'); 
      return $q.reject(response); 
     } else { 
      return $q.reject(response); 
     } 
    } 
    return function(promise) { 
     return promise.then(success, error); 
    } 
}]; 

$httpProvider.responseInterceptors.push(interceptor); 
22

mi sono imbattuto in questo problema pure. Stavamo aggiungendo stringhe di query a tutte le nostre chiamate $ http con un intercettore. Finì per rompere i nostri template, perché guardando in $ templateCache il nome del template con la stringa di query non veniva trovato (il template era originariamente messo in cache con il solo utilizzo del suo id).

Gli intercettori angolari $ httpProvider intercettano le chiamate del modulo $ http. Queste chiamate $ http non sono necessariamente reali richieste HTTP GET/POST, ma possono anche essere chiamate per ottenere modelli in $ templateCache. Sembra che quando si fa riferimento a un modello incorporato, prima viene utilizzato il modulo $ http (che esegue prima l'intercettore) e quindi il modulo $ http cercherà in $ templateCache per vedere se il modello è già memorizzato nella cache. Se $ http scopre che l'elemento esiste in $ templateCache, lo restituirà, altrimenti tenterà di fare una richiesta HTTP effettiva per ottenere il modello.

La nostra soluzione era includere il modulo $ templateCache nel nostro intercettore e controllare manualmente se la richiesta http esiste in $ templateCache. Se la richiesta non è in $ templateCache aggiungi la nostra stringa di query, se è in $ templateCache, semplicemente restituiscilo.

$httpProvider.interceptors.push(function($templateCache) { 
    return { 
     'request' : function(request) { 
      // If the request is a get and the request url is not in $templateCache 
      if(request.method === 'GET' && $templateCache.get(request.url) === undefined) { 
       // Item is not in $templateCache so add our query string 
       request.url = request.url + '?time=' + new Date().getTime(); 
      } 
      return request; 
     } 
    }; 
}); 
+2

Per aggiungere a questo, potrebbe non essere necessario '$ templateCache' iniettato qui. Penso che 'request.cache' punti ad esso così' request.cache.get (request.url) 'essenzialmente fa la stessa cosa – ragamufin

+0

@ragamufin questo è vero, sebbene request.cache possa anche essere impostato su true per abilitare il default $ cache http – leeb