2013-07-11 12 views
5

Ich erstelle eine Anwendung mit AngularJS Framework.AngularJS - Browser Caching JSON Daten

Das Problem:

Wenn ich zu einer anderen Domäne aus meiner Anwendung springen oder einer Seite und dann, wenn ich die Geschichte verwende zurück-Taste, um meine app zurück zu bekommen, erhalte ich wieder nur JSON. Die gleiche Situation passiert, wenn ich aus meiner App aus dem App-Browser zurückspringe und dann, wenn ich mit der Vorwärts-Taste zu meiner App gehe, wieder nur JSON zurückbekomme. Back/Forward funktioniert gut in meiner App, es passiert nur, wenn ich zu einer anderen Domain gehe.

Warum ist das? Ich denke, es hängt damit zusammen, wie man etwas zwischenspeichert, denn wenn ich meine App zurück-/weiterleite, wird keine Anfrage an den Server gesendet.

Sie können sehen, was ich rede, wenn Sie diese URL gehen - http://test.deving.cz/admin/prihlasit/. Dann geh zurück und dann weiter.

Mein Setup:

Meine App ist so konfiguriert, HTML5 Geschichte API zu verwenden. Für eine URL, die mydomain.com/admin/ startet, gebe ich immer eine index.hmtl zurück, die angular enthält. Dann werden für jede andere URL in meiner App zwei Anfragen gesendet. Eine für die Vorlage und eine für die Daten (JSON).

Beispiel:

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

Resolve Funktion:

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

Wie konfiguriere ich das Winkel- oder meine App den Browser nicht cachen das zu sagen, Daten und immer die index.html und dann lassen Angula r die Anfragen machen?

+2

versuchen, datetime hinzuzufügen.now() to url templateUrl: '/partials/indexpage.html?id=' + neues Datum(). getTime() –

+0

@Ajaybeniwal das wird aufhören zu cachen die Vorlagen, habe ich Recht? Ich brauche es jedoch, um die Daten zwischenzuspeichern. Die Template-Caching-Funktion ist in meiner App erwünscht. – davekr

+0

könnten Sie Controller-Code teilen oder Code, wo Sie den JSON holen lösen. –

Antwort

3

In den Kommentaren Ajay Beniwal schlug vor, dass Browser von Caching zu stoppen, sollte die URL dynamisch sein:

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

Also, wenn ich so etwas in meiner Entschlossenheit Funktion:

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

der App und Browsing in der Geschichte funktioniert gut.

Allerdings fühle ich mich wie Affepatch ein ernstes Problem. Also, wenn jemand eine bessere Antwort hat, die tatsächlich die Ursache für das Problem löst, können Sie gerne antworten.

4

Ich habe das gleiche Problem. Während ich eine Problemumgehung für dieses Problem gefunden habe, denke ich, dass es eine bessere Lösung geben muss. Wenn Sie also eine bessere Lösung haben, lassen Sie es mich wissen.

Das serverseitige Framework, das ich verwende, ist Rails. So füge ich den folgenden Code

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" 

diese Zeilen Browser verhindern, dass Ihre Anfrage zwischenzuspeichern, und Sie können erkennen, ob eine Anfrage ein XHR ist es, die obigen Zeilen oder nicht, zu entscheiden, hinzuzufügen.