2014-10-27 5 views
10

Ich möchte die URL jedes Mal ändern, wenn eine ng-include Direktive eine partielle anfordert. Bisher bin ich in der Lage die URL und die Veranstaltung so zu sehen:

app.run(function ($rootScope) { 
    $rootScope.$on('$includeContentRequested', function (event, url) { 
     console.log(event); 
     console.log(url); 
    }); 
}); 

Jetzt muss ich in der Lage die URL von 'templates/incs/includedPartial.html' zu 'templates/incs/includedPartial.html?cache_version=1_1' zu ändern, dann sind die teilweise mit der neuen Verbindung.

Offensichtlich mache ich dies, um Cache-Probleme bei der Versionsänderung zu verhindern. Ist das eine gute Strategie oder gibt es eine bessere Lösung? Vielen Dank im Voraus für jede Hilfe ...

Antwort

6

Ich glaube, ich habe tatsächlich die Antwort darauf gefunden. Was Sie tun können, ist einen Interzeptor zu erstellen. Da alle Anfragen mit ng-include den generischen $ httpProvider durchlaufen, könnten Sie die Anfrage abfangen und den Cache-Buster hinzufügen.

app.factory("cacheBusterFactory", [ "VERSION", function(VERSION) { 
    return { 
     request: function(config) { 
      if(config.url.indexOf(".html", config.url.length - ".html".length) !== -1) { 
       config.url += "?v=" + VERSION.toString(); 
      } 

      return config; 
     } 
    }; 
} ]); 

"VERSION" ist in diesem Fall ein Winkel konstant, dass ich auf jeden deploy ändern:

.config([ "$httpProvider", function($httpProvider) { 
    $httpProvider.interceptors.push("cacheBusterFactory"); 
} ]) 

Wie Sie:

app.constant("VERSION", 0.1); 

und das Hinzufügen der Cache-buster wie so einfach Ich kann nur HTML-Dateien abfangen, da diese die einzigen sind, denen ich Cache-Busting hinzufügen muss. Sie können natürlich die "cacheBusterFactory" erweitern oder neu erstellen, um sie Ihren Bedürfnissen anzupassen.

0

Ich hatte ein Problem mit der $templateCache und vordefinierten Vorlagen (zB UI Bootstrap). Ich habe es gelöst, indem ich den Cache getestet habe.

app.factory("cacheBusterFactory", [ "$templateCache", "VERSION", function($templateCache, VERSION) { 
    return { 
     request: function(config) { 
      if(config.cache === $templateCache 
       && !angular.isDefined($templateCache.get(config.url))) !== -1) { 
       config.url += "?v=" + VERSION.toString(); 
      } 

      return config; 
     } 
    }; 
} ]);