使用AngularJS模型时如何防止IE8中的缓存

时间:2013-08-08 10:18:59

标签: internet-explorer caching angularjs cross-browser

我的技术堆栈是 -

  1. AngularJS
  2. 自举
  3. Spring MVC
  4. 休眠
  5. 我在做什么:

    我正在进行CRUD(创建,读取,更新和删除)

    的项目列表
    1. 通过Angular Controller将表格数据发布到Spring Controller。
    2. 弹簧控制器 - > DAO方法 - >数据库已更新
    3. Spring Controller返回“Y”或“N”
    4. Angular获取状态消息并重新加载Angular模型(Json数组填充项目列表)
    5. 与更新和删除相同
    6. 我的目标是在没有页面重新加载的情况下实现实时数据操作。

      这在Chrome中运行良好。 但是,IE无法检测到模型更改。它在添加/更新/删除(从其缓存)之前继续显示数据。 只有在我手动清除缓存后,我才真正能够看到更改的模型。

      需要有关如何使用IE8及更高版本解决此问题的帮助。

      P.S。我已经尝试过设置元标题

3 个答案:

答案 0 :(得分:5)

您可以设置

  

“服务器端响应的无缓存标头”

var AppInfrastructure = angular.module('App.Infrastructure', []);

并且在Angularjs中你可以编写拦截器,下面是示例代码:

AppInfrastructure
    .config(function ($httpProvider) {
        $httpProvider.requestInterceptors.push('httpRequestInterceptorCacheBuster');
    })    
    .factory('httpRequestInterceptorCacheBuster', function () {
        return function (promise) {
            return promise.then(function (request) {
                if (request.method === 'GET') {
                    var sep = request.url.indexOf('?') === -1 ? '?' : '&';
                    request.url = request.url + sep + 'cacheSlayer=' + new Date().getTime();
                }

                return request;
            });
        };
    });   

答案 1 :(得分:5)

与上面提到的Jquery Guru相同,但它是更新版本的angular

中的配置
.factory('noCacheInterceptor', function () {
        return {
            request: function (config) {
                console.log(config.method);
                console.log(config.url);
                if(config.method=='GET'){
                    var separator = config.url.indexOf('?') === -1 ? '?' : '&';
                    config.url = config.url+separator+'noCache=' + new Date().getTime();
                }
                console.log(config.method);
                console.log(config.url);
                return config;
           }
       };
});

验证后应删除console.logs

答案 2 :(得分:1)

@Avinash似乎你也只是使用了这个想法而不是确切的解决方案,在我尝试之前不确定你的意思,并且必须自己做不同的实现才能使它工作。

无论如何,我决定与世界其他地方分享我的发现,所以也许可以节省一些时间。

我尝试将上面的代码1实现为1 ...我遇到的第一个明显的问题是传递给promise的请求参数内部的对象结构与上面显示的不同,以获得。方法和.url我需要先进入.config。所以它是request.config.method。

但这不是主要问题,我的问题是即使在实现这个之后,调用的最终url也没有附加此cacheSlayer。

我的解决方案:)在创建传入的$资源时(网址,附加设置,方法)。在我传入{'cacheSlayer':new Date()。getTime()}的其他设置中,这样就开始将它添加到我的资源url中。

希望这有帮助