Angular HTTP-перехватчик, выполненный для внедренных ng-шаблонов - программирование
Подтвердить что ты не робот

Angular HTTP-перехватчик, выполненный для внедренных ng-шаблонов

Я использую перехватчик Angular:

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-запросы или узнать, загружаю ли я что-то с сервера или только с шаблоном?

4b9b3361

Ответ 1

Я столкнулся с этой проблемой. Мы добавляли строки запросов ко всем нашим вызовам $http с перехватчиком. Это закончилось тем, что нарушало наши шаблоны, потому что при поиске в $templateCache имя шаблона с строкой запроса не было найдено (шаблон был первоначально кэширован с использованием только его id).

Angular $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;
        }
    };
});

Ответ 2

Из того, что я собрал, вы ищете способ увидеть, содержит ли запрос файл шаблона или нет. Что вы можете сделать, это посмотреть 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);