Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs-如何清除$routeProvider';s templateUrl的缓存_Angularjs - Fatal编程技术网

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

Angularjs-如何清除$routeProvider';s templateUrl的缓存,angularjs,Angularjs,在我的应用程序中,我有一个非常基本的用例,前端使用AngularJS(1.0.8),后端使用Grails。在应用程序布局中,我有一个语言切换器,允许用户更改语言。切换语言后,它会执行新的http请求来检索页面。Grails会正确翻译所有与语言相关的内容(即标签)。这只适用于Chrome、FF和so,而不适用于IE。IE仅为主请求呈现的布局呈现适当的语言 我找到了问题所在。我已经定义了$routeProvider,在这里我加载了应用程序的主要内容。默认情况下,它是缓存的,因此IE不会加载$rout

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

我找到了问题所在。我已经定义了
$routeProvider
,在这里我加载了应用程序的主要内容。默认情况下,它是缓存的,因此IE不会加载
$routeProvider
templateUrl
,因为它是从缓存加载它们的:

myApp.config(function ($routeProvider) {
        $routeProvider.
            when('/', {controller: 'MyCtrl', templateUrl: '/eshop/myConfig'})
});
我不明白的是为什么它能在所有其他浏览器中工作

我找到了一些关于如何清除缓存的帖子,但它们对我不起作用。有什么解决办法吗?如果没有,我发现
$routeProvider
对我的用例完全没有用处。 我发现的帖子:


因此,我找到的唯一解决方案是完全禁用ajax查询的缓存。我在这里找到了解决方案:


我不喜欢这个解决方案,因为它禁止对真正静态的内容进行兑现。因此,如果您有比共享更好的解决方案。

我对$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();
});