2017-07-04 99 views
0

我發現我的應用程序經常會出現意想不到的問題,因爲用戶在瀏覽器中緩存了模板。 我試過$window.location.reload(true),但即使如此,chrome也提供緩存中的模板。角模板版本

有沒有一個簡單的解決方案,例如像使用攔截器一樣動態添加版本查詢參數到模板URL?

回答

3

雖然在其他類似的問題上,人們主張使用$templateCache並一次加載所有內容。這不是我尋找的解決方案,因爲它會通過增加應用程序大小並犧牲angular-ui-router提供的延遲加載來增加應用程序的首次加載時間。

所以,下面是我做的。 創建了包含版本的值提供程序。 該文件被縮小幷包含在索引頁中,因此隨頁面一起加載。

angular.module('my-app').value('version', 'X.X.X'); 

,我發現我的狀態,指示,甚至在所有templateUrl NG-包括通過$http服務加載,從而在獲取模板的時候,我可以注入一個查詢參數。所以我加了下面的應用程序的配置塊線:

angular.module('my-app').config(['$httpProvider', function($httpProvider){ 
    $httpProvider.interceptors.push(['$q', 'version', function($q, version) { 
     return { 
      'request': function (request) { 
       if (request.url.substr(-5) == '.html') { 
        request.params = { 
         v: version 
        } 
       } 
       return $q.resolve(request); 
      } 
     } 
    }]); 
}]); 

所以,我所有的模板被稱爲與版本號,現在的瀏覽器等待新的模板,如果版本增加加載。 我通過api定期檢查版本更新。如果檢測到新版本,我會提示用戶重新加載頁面。在用戶批准,我通過$window.location.reload(true)

更新

以下重裝是片段,以檢查是否有新的版本。它可以根據使用情況而有所不同。由於我們在這裏有專門的發佈週期,因此我們在每個窗口焦點和第一次加載期間檢查新版本。

angular.module('my-app').run(['$rootScope', '$window', 'version', 'configService', function($rootScope, $window, version, configService){ 
    $rootScope.checkVersion = function() { 
     configService.getVersion().then(function (data) { 
      if (data.version != version) { 
       // show user a message that new version is available 
       promptUserForReload().then(function() { 
        $window.location.reload(true); 
       }) 
      } 
     }); 
    } 

    $window.addEventListener("focus", $rootScope.checkVersion); 

    $rootScope.checkVersion(); 
}]) 
+0

感謝普什卡它的工作就像一個魅力u能也共享代碼如何您定期檢查 –

+0

阿卜杜勒嗨版,我已經更新了我的答案與代碼片段。 – Pushkar

+0

謝謝普希卡。 –

0

沒有攔截U可以只添加後修復版本變量模板URL。 templateUrl:「?腳本/應用/ blabla.html版本版本=」 +版本

+0

但是,我將不得不爲所有模板網址做到這一點,並可能會遇到問題,如果錯過了某個地方。另外,所有從事這些項目的開發者都必須被告知遵循這種模式。 – Pushkar