Pus*_*kar 0 version browser-cache angularjs single-page-application
我发现我的应用程序经常出现意外问题,因为用户在浏览器中缓存了模板.我试过,$window.location.reload(true)但即使这样,chrome也会从缓存中提供模板.
有没有一个简单的解决方案,比如使用Interceptor之类的东西动态地向模板URL添加版本查询参数?
虽然在其他类似的问题上,人们会$templateCache一次性使用和加载所有东西.这不是我正在寻找的解决方案,因为它会通过增加应用程序大小和牺牲angular-ui-router提供的延迟加载来增加应用程序首次加载时间.
所以,下面是我做的.创建了包含版本的值提供程序.此文件缩小并包含在索引页中,因此随页面一起加载.
angular.module('my-app').value('version', 'X.X.X');
Run Code Online (Sandbox Code Playgroud)
我注意到我的所有templateUrl状态,指令甚至ng-include都是通过$http服务加载的,因此在获取模板时我可以注入一个查询参数.所以我在app的配置块中添加了以下行:
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);
}
}
}]);
}]);
Run Code Online (Sandbox Code Playgroud)
因此,我的所有模板都会调用版本号,现在浏览器会在版本增加时等待加载新模板.我通过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();
}])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1682 次 |
| 最近记录: |