2012-11-19 56 views
32

我正在使用幾個指令來處理AngularJS應用程序。該指令的模板存儲在一個單獨的html文件中。編輯這些模板時,我的瀏覽器在重新加載後沒有檢測到任何更改,並始終使用緩存版本。檢測到對源代碼的任何其他更改並導致重新加載。強制重載指令的模板

我想這個問題有點像$ templateCache,它似乎在加載模板時被AngularJS使用。

我在AngularJS 1.0.2的源代碼中發現什麼是線4317這是compileTemplateUrl()的一部分下面:

$http.get(origAsyncDirective.templateUrl, {cache: $templateCache}) 

如果任何人有過這樣的問題,我想知道如果有方法可以告訴AngularJS何時緩存,何時不緩存。

回答

15

模板緩存存儲在瀏覽器中,因爲這是一個JavaScript應用程序。您可以實際上手動提供$緩存,或者使用開發人員工具停止瀏覽器緩存模板(因爲看起來對於生產而言,緩存不會成爲問題)。

對於強制餵食緩存:

看本fiddle工作。

從高速緩存模板停止你的瀏覽器(從這個Google Groups post引,關於這個問題,精確地):

我和我的團隊也遇到了同樣的問題。我們使用Chrome開發 的解決方案是打開開發工具,並在右下角選擇 齒輪。然後選擇網絡 - 禁用緩存。

這修復了我們所有的部分/模板緩存問題。

+14

它並沒有真正解決我的問題,以禁用鉻緩存我的本地Chrome版本作爲用戶是瀏覽網頁還是加載緩存版。 –

+2

(對不起,雙重評論,但我不能再編輯它...)強制緩存重新加載模板每次看起來像一個黑客對我來說。但我想我別無選擇。爲我的本地chrome版本禁用chrome緩存解決了這個問題。瀏覽網站的其他訪問者仍會加載緩存版本。因此,在用戶清除緩存之前,生產模式中的更新不可見。 –

+0

那麼,我使用Yeoman來做我的angularJS項目,因此部署的文件的名稱前綴爲哈希。這使得緩存並不是一個真正的問題,因爲應用程序的任何基本改變都會被立即識別(這些文件有不同的命名)。爲了測試,我也使用了Yeoman,並強制重新加載所有資產。 –

36

我知道這是一個老問題,但這裏有一個更簡單的修復方法,儘管它有點破解,它適用於我,並且不要求您對$ templateCache執行任何操作。

每當我遇到這個問題(我看到它在指令中的模板,而且靜態JSON文件),我想補充的查詢參數的URL的結尾被加載,就像這樣:

... 
templateUrl: "partials/template.html?1", 
... 

每當我對模板進行了修改,但不會重新加載,最後我會增加該數字。由於瀏覽器不知道這是否意味着服務器特殊的東西,它應該嘗試重新加載已更改的URL,而不管它是否被緩存。這也將確保文件在生產環境中重新加載。

+7

如果你有很多模板,你可以使用變量 var v =「1」; $ routeProvider.when('/',{templateUrl:'/pages/home.html?v='+ v,controller:'HomeCtlr'}); – dpineda

+1

''partials/template.html?「 + Date.now()'爲我完美工作。 – mhodges

1
app.controller('someCtrl', function ($scope, $cacheFactory, templateRequest) 
{ 
    $scope.refreshTemplate = function() 
    { 
     var tpl = "<template name>"; 
     $cacheFactory.get('templates').remove(tpl); 
     $templateRequest(tpl).then(function ok(){ 
      console.log("Template "+tpl+" loaded."); 
     }); 
    } 
    ... 
    } 

那麼當你調用refreshTemplate功能,你會重新加載

+0

我不知道爲什麼這不是被接受的答案...按預期工作... – Scriptlabs