Angularjs - 如何清除$ routeProvider的templateUrl缓存

时间:2013-11-29 11:42:20

标签: angularjs

我的应用程序中有一个非常基本的用例,我使用AngularJS(1.0.8)作为前端,Grails作为后端。在应用程序布局中,我有一个语言切换器,允许用户更改语言。切换语言时,会执行新的http请求来检索页面。 Grails可以正确翻译所有与语言相关的内容(即标签)。这仅适用于Chrome,FF等,但不适用于IE。 IE只为主要请求呈现的布局呈现正确的语言。

我找到了问题所在。我已定义$routeProvider,其中我加载了主要的应用内容。它默认是缓存的,因此IE不会加载templateUrl的{​​{1}},因为它会从缓存中加载它们:

$routeProvider

我不知道为什么它适用于所有其他浏览器。

我发现了一些如何清除缓存的帖子,但它们对我不起作用。我有什么解决方案吗?如果没有,我发现myApp.config(function ($routeProvider) { $routeProvider. when('/', {controller: 'MyCtrl', templateUrl: '/eshop/myConfig'}) }); 对我的用例完全没用。 邮寄我发现:

3 个答案:

答案 0 :(得分:9)

下面应该这样做。您可以使用$ 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();
});

答案 1 :(得分:6)

我遇到了与$ 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”来挽救我的生命。因为我也使用RequireJS作为我的AngularJS项目,所以这个“buildNumber”也将通过使用代码添加到每个依赖JS文件中:

require.config({
    urlArgs: "v=" + window.buildNumber,
    paths: {....}
});

然后每次更改JS源代码或模板html时,我只需要在全局范围内更新“buildNumber”。这只是对生产环境中未来更新的一种思考。希望这会有所帮助。

答案 2 :(得分:2)

所以我发现的唯一解决方案是完全禁用ajax查询的缓存。我在这里找到了解决方案:https://stackoverflow.com/a/19771501/607038

myModule.config(['$httpProvider', function($httpProvider) {
    //initialize get if not there
    if (!$httpProvider.defaults.headers.get) {
        $httpProvider.defaults.headers.get = {};    
    }
    //disable IE ajax request caching
    $httpProvider.defaults.headers.get['If-Modified-Since'] = '0';
}]);

我不喜欢这个解决方案,因为它禁止兑现真正静态的内容。所以如果你有更好的解决方案而不是分享它。