Угловой 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);
Другие вопросы по тегам