2017-07-04 72 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