2015-10-06 84 views
9

我想確保我的用戶在部署後看到我的Angular應用的最新版本。在這種情況下清除模板緩存的正確策略是什麼?部署後清除模板緩存

我看過你可以做$templateCache.removeAll()的地方app.run,但是這會完全禁用緩存嗎?

回答

9

您需要編寫一個攔截器並「捕獲」所有模板請求 - 您應該可以在此攔截器中添加一個URL參數來對您的模板資產進行版本化。

例子:

// App .config() 
$httpProvider.interceptors.push(function($templateCache) { 
    return { 
    'request' : function(request) { 
     if($templateCache.get(request.url) === undefined) { // cache miss 
      // Item is not in $templateCache so add our query string 
      request.url = request.url + '?appVersion=' + appService.getConfig().version; 
     } 
     return request; 
    } 
}; 

你當然需要在每次部署新版本的時間來更新這個應用程序的配置(通過構建任務可以自動更新這個文件)。您可能需要添加額外的檢查(例如,如果URL路徑以'.html'結尾,請進行比較),以確保您不會高估實際的HTTP請求。

這種方法的下降是有時你可能有一個模板沒有更新,你不希望瀏覽器緩存被丟棄。如果這是你的情況,那麼你應該爲每個添加一些md5(templateContent)---這可以通過Grunt/Gulp在構建時實現。

+1

只要添加檢查'if(request.url.endsWith(「。html」)){...}'就像一個魅力!我爲這個問題嘗試了很多解決方案,這對我的用例來說是最好的。 – hmartos

+0

@hmartos請注意,.endsWith在所有瀏覽器和平臺上都不被支持。 – tuks