Угловой HTTP-перехватчик для встроенных ng-шаблонов
У меня работает угловой перехватчик:
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);
});
};
})
и один большой HTML-файл, который содержит шаблоны, такие как <script type="text/ng-template" id="home-template">
, К сожалению, мой HTTP-перехватчик перехватывает не только загрузку HTTP-запросов, но и загрузку шаблонов (которые уже загружены в HTML-файл) для контроллеров, которые определены как when('/', {controller:MainController, templateUrl:'home-template'})
, Есть ли способ, как заставить перехватчик перехватывать только HTTP-запросы или как узнать, загружаю ли я что-то с сервера или просто шаблон?
2 ответа
Я тоже столкнулся с этим вопросом. Мы добавляли строки запросов ко всем нашим вызовам $ http с помощью перехватчика. Это привело к нарушению наших шаблонов, потому что при поиске в $templateCache имя шаблона со строкой запроса не было найдено (шаблон изначально был кэширован с использованием только его идентификатора).
Угловые перехватчики $httpProvider будут перехватывать вызовы модуля $ http. Эти вызовы $ http не обязательно являются реальными запросами HTTP GET / POST, они также могут быть вызовами для получения шаблонов в $templateCache. Кажется, что при ссылке на встроенный шаблон сначала используется модуль $ http (который сначала запускает перехватчик), а затем модуль $ http будет искать в $templateCache, чтобы увидеть, кэширован ли уже шаблон. Если $ http обнаружит, что элемент существует в $templateCache, он вернет его, если нет, попытается выполнить реальный HTTP-запрос для получения шаблона.
Нашим решением было включить модуль $templateCache в наш перехватчик и вручную сначала проверить, существует ли http-запрос в $templateCache. Если запрос не находится в $templateCache, добавьте нашу строку запроса, если он находится в $templateCache, просто верните его.
$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;
}
};
});
Исходя из того, что я понял, вы ищете способ узнать, содержит ли запрос файл шаблона или нет. Что вы могли бы сделать, это посмотреть на url
запроса и посмотреть, если он содержит путь к вашей директории partials.
Дайте мне знать, если это то, что вы искали:
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);