2013-05-25 28 views
14

Tôi có một đánh chặn làm việc kiễu góc:đánh chặn HTTP góc được thực hiện cho nhúng ng-templates

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

và một file html lớn, trong đó có các mẫu như <script type="text/ng-template" id="home-template">. Rất tiếc, trình chặn chặn HTTP của tôi không chỉ tải các yêu cầu HTTP mà còn tải các mẫu (đã được tải trong tệp html) cho các trình điều khiển được định nghĩa như when('/', {controller:MainController, templateUrl:'home-template'}). Có cách nào để làm cho interceptor chặn chỉ các yêu cầu HTTP hoặc làm thế nào để nhận ra cho dù tôi đang tải một cái gì đó từ máy chủ hoặc chỉ là một mẫu?

+0

Tôi không chắc mình hiểu câu hỏi của bạn. Bạn có muốn chặn các yêu cầu mẫu không? hoặc bạn có muốn đánh chặn mọi thứ trừ các yêu cầu mẫu không? –

+0

chặn tất cả mọi thứ trừ yêu cầu mẫu – igo

Trả lời

0

Từ những gì tôi đã thu thập, bạn đang tìm cách xem liệu yêu cầu có liên quan đến tệp mẫu hay không. Những gì bạn có thể làm là xem số url của yêu cầu và xem liệu nó có chứa đường dẫn đến thư mục partials của bạn hay không.

Hãy cho tôi biết nếu điều này là những gì bạn đang tìm kiếm:

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

Tôi chạy vào vấn đề này là tốt. Chúng tôi đã thêm chuỗi truy vấn vào tất cả các cuộc gọi $ http của chúng tôi với một máy đánh chặn. Nó kết thúc phá vỡ các khuôn mẫu của chúng tôi, bởi vì khi tìm kiếm $ templateCache tên mẫu với chuỗi truy vấn không được tìm thấy (mẫu ban đầu được lưu trữ với chỉ sử dụng id của nó).

Máy đánh chặn $ httpProvider góc cạnh sẽ chặn các cuộc gọi mô-đun $ http. Các cuộc gọi $ http này không nhất thiết là các yêu cầu HTTP GET/POST thực sự mà chúng cũng có thể là các cuộc gọi để nhận các mẫu trong $ templateCache. Dường như khi một mẫu nhúng được tham chiếu, đầu tiên mô-đun $ http được sử dụng (chạy trình chặn trước) và sau đó mô-đun $ http sẽ tìm trong templateCache $ để xem mẫu có được lưu trữ hay không. Nếu $ http tìm ra mục tồn tại trong $ templateCache nó sẽ trả về nó, nếu không nó sẽ cố gắng thực hiện một yêu cầu HTTP thực tế để lấy mẫu.

Giải pháp của chúng tôi là bao gồm mô-đun $ templateCache trong trình chặn và kiểm tra thủ công trước nếu yêu cầu http tồn tại trong $ templateCache. Nếu yêu cầu không có trong templateCache $, hãy thêm chuỗi truy vấn của chúng ta, nếu nó nằm trong $ templateCache thì đơn giản là trả về nó.

$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

Để thêm vào điều này, bạn có thể không cần phải nhập '$ templateCache' vào đây. Tôi nghĩ rằng 'request.cache' trỏ đến nó vì vậy' request.cache.get (request.url) 'về cơ bản thực hiện điều tương tự – ragamufin

+0

@ragamufin điều này là đúng, mặc dù request.cache cũng có thể được đặt thành true để cho phép mặc định $ bộ nhớ cache http – leeb