2014-05-11 9 views
14

Zauważyłem, że od czasu do czasu dokonam zmiany w jednym z szablonów w mojej aplikacji AngularJS i że w czasie wykonywania zmiana nie będzie widoczna. Zamiast tego będę musiał odświeżyć aplikację, a jeśli to się nie powiedzie, przejdź do samej ścieżki szablonu i odśwież ją, aby zobaczyć tę zmianę.Wyłącz buforowanie szablonów w AngularJS z ui-routerem

Jaki jest najlepszy sposób, aby zapobiec buforowaniu tych szablonów w ten sposób? Najlepiej byłoby, gdyby były one buforowane podczas bieżącego używania aplikacji Angular, ale przy następnym ładowaniu strony będą pobierać najnowsze i najlepsze szablony bez konieczności ręcznego odświeżania.

Używam ui-routera, jeśli robi to jakąkolwiek różnicę. Dzięki!

+1

http://stackoverflow.com/questions/14718826/angularjs-disable-partial-caching-on-dev-machine –

Odpowiedz

16

Można użyć dekoratora i aktualizuje usługę $ templateFactory interfejsie routera dołączyć przyrostek templateUrl

function configureTemplateFactory($provide) { 
    // Set a suffix outside the decorator function 
    var cacheBuster = Date.now().toString(); 

    function templateFactoryDecorator($delegate) { 
     var fromUrl = angular.bind($delegate, $delegate.fromUrl); 
     $delegate.fromUrl = function (url, params) { 
      if (url !== null && angular.isDefined(url) && angular.isString(url)) { 
       url += (url.indexOf("?") === -1 ? "?" : "&"); 
       url += "v=" + cacheBuster; 
      } 

      return fromUrl(url, params); 
     }; 

     return $delegate; 
    } 

    $provide.decorator('$templateFactory', ['$delegate', templateFactoryDecorator]); 
} 

app.config(['$provide', configureTemplateFactory]); 
+0

Z tego powodu przełączam się na ui-router, ale mam problem z tym, że przykład działa. Czy możesz podać, w jaki sposób mogę to nazwać, aby dołączyć sufiks do templateUrl? Dzięki. – iTrout

+1

Dobrze wiedzieć o tej opcji konfiguracji, ale czy te unikatowe strony nie będą gromadzone w pamięci podręcznej po stronie klienta? –

+0

Powyższy kod jest obejściem pamięci podręcznej przeglądarki, więc następnym razem, gdy ponownie załadujesz aplikację, wartość zmiennej cacheBuster będzie inna, a szablony będą ponownie pobierane z serwera. Chodzi o to, aby dla każdej sesji mieć inną wartość cacheBuster. –

1

Powyższy roztwór świetnie i nie pracuje dla URL szablonu

function templateUrl: function($stataParams) { return '/serverUrl?id=' + $stataParams.id + '&cid=' + $stataParams.cid; } 

ustalonych przez

function templateFactoryDecorator($delegate) { 
    var fromUrl = angular.bind($delegate, $delegate.fromUrl); 
    $delegate.fromUrl = function (url, params) { 
     if (url !== null && angular.isDefined(url)) { 
      if (typeof url == 'function') { 
       url = url.call(url, params); 
      } 
      if (angular.isString(url)) { 
      url += (url.indexOf("?") === -1 ? "?" : "&"); 
      url += "v=" + Date.now().toString(); 
      } 
     } 

     return fromUrl(url, params); 
    }; 

    return $delegate; 
} 
+1

Świetne rozwiązanie !, ale nie działa dla mnie szablonów dyrektyw – hmartos

Powiązane problemy