2015-10-06 40 views
9

Tôi muốn đảm bảo người dùng của mình thấy phiên bản mới nhất của ứng dụng Góc của tôi sau khi triển khai. Chiến lược phù hợp để xóa bộ đệm mẫu trong trường hợp đó là gì?Xóa bộ nhớ cache mẫu sau khi triển khai

Tôi đọc ở đâu đó bạn có thể làm $templateCache.removeAll() trong app.run, nhưng điều này sẽ vô hiệu hóa bộ nhớ đệm hoàn toàn tôi nghĩ?

Trả lời

9

Bạn cần phải viết trình chặn và "bắt" tất cả các yêu cầu mẫu - bạn sẽ có thể trong trình chặn này để thêm thông số URL có thể phiên bản nội dung mẫu của bạn.

Ví dụ:

// App .config() 
$httpProvider.interceptors.push(function($templateCache) { 
    return { 
    'request' : function(request) { 
     if($templateCache.get(request.url) === undefined) { // cache miss 
      // Item is not in $templateCache so add our query string 
      request.url = request.url + '?appVersion=' + appService.getConfig().version; 
     } 
     return request; 
    } 
}; 

Bạn sẽ tất nhiên cần phải cập nhật cấu hình ứng dụng này mỗi khi bạn triển khai phiên bản mới của bạn (thông qua xây dựng các nhiệm vụ bạn có thể cập nhật file này tự động). Bạn có thể cần thêm các kiểm tra bổ sung (ví dụ: nếu so sánh nếu đường dẫn URL kết thúc bằng '.html'), do đó bạn chắc chắn rằng bạn không yêu cầu HTTP thực sự cao.

Mặt sau nhược điểm của phương pháp này là đôi khi bạn có thể có mẫu chưa được cập nhật và bạn không muốn bộ nhớ cache của trình duyệt bị chuyển vào thùng rác. Nếu đây là trường hợp của bạn, sau đó bạn nên thêm một số loại md5 (templateContent) cho mỗi --- điều này có thể đạt được tại thời gian xây dựng thông qua Grunt/Gulp là tốt.

+1

Chỉ cần thêm kiểm tra 'if (request.url.endsWith (". Html ")) {...}' hoạt động như một sự quyến rũ! Tôi đã thử rất nhiều giải pháp cho vấn đề này và giải pháp này là tốt nhất cho trường hợp sử dụng của tôi. – hmartos

+0

@hmartos Hãy cẩn thận, .endsWith không được hỗ trợ tốt trên tất cả các trình duyệt và nền tảng. – tuks

Các vấn đề liên quan