Angularjs-如何清除$routeProvider';s templateUrl的缓存
在我的应用程序中,我有一个非常基本的用例,前端使用AngularJS(1.0.8),后端使用Grails。在应用程序布局中,我有一个语言切换器,允许用户更改语言。切换语言后,它会执行新的http请求来检索页面。Grails会正确翻译所有与语言相关的内容(即标签)。这只适用于Chrome、FF和so,而不适用于IE。IE仅为主请求呈现的布局呈现适当的语言 我找到了问题所在。我已经定义了Angularjs-如何清除$routeProvider';s templateUrl的缓存,angularjs,Angularjs,在我的应用程序中,我有一个非常基本的用例,前端使用AngularJS(1.0.8),后端使用Grails。在应用程序布局中,我有一个语言切换器,允许用户更改语言。切换语言后,它会执行新的http请求来检索页面。Grails会正确翻译所有与语言相关的内容(即标签)。这只适用于Chrome、FF和so,而不适用于IE。IE仅为主请求呈现的布局呈现适当的语言 我找到了问题所在。我已经定义了$routeProvider,在这里我加载了应用程序的主要内容。默认情况下,它是缓存的,因此IE不会加载$rout
$routeProvider
,在这里我加载了应用程序的主要内容。默认情况下,它是缓存的,因此IE不会加载$routeProvider
的templateUrl
,因为它是从缓存加载它们的:
myApp.config(function ($routeProvider) {
$routeProvider.
when('/', {controller: 'MyCtrl', templateUrl: '/eshop/myConfig'})
});
我不明白的是为什么它能在所有其他浏览器中工作
我找到了一些关于如何清除缓存的帖子,但它们对我不起作用。有什么解决办法吗?如果没有,我发现$routeProvider
对我的用例完全没有用处。
我发现的帖子:
我不喜欢这个解决方案,因为它禁止对真正静态的内容进行兑现。因此,如果您有比共享更好的解决方案。我对$routeProvider也有同样的问题。是的,$templateCache在这种情况下没有帮助。我没有继续查找真正的“缓存”源,而是在templateUrl之后添加了stamp参数。 在我的代码中:
$routeProvider.
when('/', {templateUrl: '../views/home.html?v='+window.buildNumber, controller: 'HomeCtrll'}).
when('/report', {templateUrl: '../views/form.html?v='+window.buildNumber, controller: 'FormCtrll'}).
otherwise({redirectTo: '/'});
不幸的是,我使用了一个全局变量“buildNumber”来拯救我的生命。因为我的AngularJS项目也使用RequireJS,所以这个“buildNumber”也将使用以下代码添加到每个依赖项JS文件中:
require.config({
urlArgs: "v=" + window.buildNumber,
paths: {....}
});
然后每次更改JS源代码或模板html时,我只需要在全局范围内更新“buildNumber”。这只是生产环境中未来更新的一个想法。希望这能有所帮助。下面的应该可以。您可以使用$templateCache操纵angularjs的模板缓存,因此$routeProvider将在每次访问控制器时以新模板的形式加载该模板
myApp.config(function ($routeProvider) {
$routeProvider.
when('/', {controller: 'MyCtrl', templateUrl: '/eshop/myConfig'})
})
.controller('MyCtrl', function ($scope, $templateCache) {
$templateCache.remove('/eshop/myConfig');
// or
$templateCache.removeAll();
});
这可能是因为后端发送了一些缓存头,使得浏览器一次又一次地请求Webkit和Firefox的模板,而IE没有解释它们?一旦语言发生变化,重新加载应用程序可能是一个合理的折衷方案。另一种方法可能是完全关闭
$http
缓存。为什么不在进行http调用之前,单击语言切换器手动清除templatecache。使用$templatecache.removeAll()我已经按照您的建议尝试了$templatecache.removeAll(),但没有帮助。它会清除缓存,但$routeProvider甚至不会为给定的templateUrl请求服务器。当我刷新时,它会再次请求服务器。看来问题出在别的地方了。
myApp.config(function ($routeProvider) {
$routeProvider.
when('/', {controller: 'MyCtrl', templateUrl: '/eshop/myConfig'})
})
.controller('MyCtrl', function ($scope, $templateCache) {
$templateCache.remove('/eshop/myConfig');
// or
$templateCache.removeAll();
});