2013-07-11 36 views
5

Tôi đang tạo một ứng dụng bằng cách sử dụng khung công tác AngularJS.AngularJS - bộ nhớ đệm trình duyệt dữ liệu JSON

Vấn đề:

Khi tôi nhảy ra khỏi ứng dụng của tôi đến một tên miền khác hoặc một trang và sau đó khi tôi sử dụng lịch sử trở lại nút để trở lại ứng dụng của tôi, tôi nhận được lại chỉ JSON. Tình huống tương tự xảy ra khi tôi nhảy ra khỏi ứng dụng của tôi duyệt lại trong lịch sử, và sau đó khi tôi sử dụng nút chuyển tiếp để đi đến ứng dụng của tôi, một lần nữa tôi chỉ nhận được JSON trở lại. Quay lại/chuyển tiếp hoạt động tốt trong ứng dụng của tôi, nó chỉ xảy ra khi tôi đi đến miền khác nhau.

Tại sao lại như vậy? Tôi nghĩ rằng nó có liên quan đến bộ nhớ đệm một số như thế nào, bởi vì khi tôi quay trở lại/chuyển tiếp đến ứng dụng của tôi, không có yêu cầu được gửi đến máy chủ.

Bạn có thể xem nội dung tôi đang nói đến nếu bạn truy cập url này - http://test.deving.cz/admin/prihlasit/. Sau đó quay trở lại và sau đó chuyển tiếp.

Thiết lập của tôi:

Ứng dụng của tôi được định cấu hình để sử dụng API lịch sử HTML5. Đối với một url bắt đầu mydomain.com/admin/ tôi luôn trả về một index.hmtl chứa angular. Sau đó, đối với mọi url khác trong ứng dụng của tôi, hai yêu cầu sẽ được gửi đi. Một cho mẫu và một cho dữ liệu (JSON).

Ví dụ:

$routeProvider.when('/admin/page/', {controller: 'PageListCtrl', templateUrl: '/templates/page/list/', resolve: 'PageListCtrl.resolve'})

PageListCtrl:

angular.module('page').controller('PageListCtrl', ['$scope', 'data', function($scope, data) { 
    $scope.pages = data; 
}]); 

chức năng Giải quyết:

resolve = {data: 
      function($http, $q){ 
       var delay = $q.defer(); 
       $http.get().success(function(data){ 
        delay.resolve(data['data']); 
       }); 
       return delay.promise; 
      } 
     } 

Làm thế nào tôi nên cấu hình góc cạnh hoặc ứng dụng của tôi để cho trình duyệt không để bộ nhớ cache dữ liệu và luôn nhận được index.html và sau đó cho phép angula r làm các yêu cầu?

+2

thử thêm datetime.now() đến url templateUrl: '/partials/indexpage.html?id=' + new Date(). getTime() –

+0

@Ajaybeniwal điều này sẽ ngừng lưu bộ nhớ đệm các mẫu, tôi có đúng không? Tuy nhiên, tôi cần nó để ngăn chặn bộ nhớ đệm dữ liệu. Chức năng bộ đệm mẫu là mong muốn trong ứng dụng của tôi. – davekr

+0

bạn có thể chia sẻ mã điều khiển hoặc giải mã ở nơi bạn đang tìm nạp json hay không. –

Trả lời

3

Trong những ý kiến ​​Ajay beniwal gợi ý rằng để ngăn chặn trình duyệt từ bộ nhớ đệm, url nên năng động:

'/partials/indexpage.html?id=' + new Date().getTime() 

Vì vậy, nếu tôi làm điều gì đó như thế này trong chức năng quyết tâm của tôi:

$http.get($location.path() + '?id=' + new Date().getTime()) 

sự ứng dụng và duyệt web trong lịch sử hoạt động tốt.

Tuy nhiên tôi cảm thấy giống như khỉ vá một vấn đề nghiêm trọng. Vì vậy, nếu bất cứ ai có một câu trả lời tốt hơn mà actualy giải quyết nguyên nhân cho vấn đề cảm thấy tự do để trả lời.

4

Tôi gặp vấn đề tương tự. Trong khi tôi tìm thấy một giải pháp cho vấn đề này, tôi nghĩ rằng phải có một giải pháp tốt hơn. Vì vậy, nếu bạn có bất kỳ giải pháp nào tốt hơn, vui lòng cho tôi biết.

Khung bên máy chủ tôi đang sử dụng là Rails. Vì vậy, tôi thêm đoạn mã sau

response.headers["Cache-Control"] = "no-cache, no-store, max-age=0, must-revalidate" 
    response.headers["Pragma"] = "no-cache" 
    response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT" 

Những dòng này sẽ ngăn trình duyệt để cache yêu cầu của bạn, và bạn có thể phát hiện xem một yêu cầu là một XHR để quyết định thêm những dòng trên hay không.

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