【问题标题】:How to Prevent Caching in IE8 when using AngularJS Models使用 AngularJS 模型时如何防止 IE8 中的缓存
【发布时间】:2013-08-10 00:21:04
【问题描述】:

我的技术栈是——

  1. AngularJS
  2. 引导程序
  3. Spring MVC
  4. 休眠

我在做什么:

我正在执行 CRUD(创建、读取、更新和删除)的项目列表

  1. 通过 Angular 控制器将表单数据发布到 Spring 控制器。
  2. Spring Controller -> DAO 方法 -> DB 更新
  3. 弹簧控制器返回“Y”或“N”
  4. Angular 获取状态消息并重新加载 Angular 模型(用于填充项目列表的 Json 数组)
  5. 与更新和删除相同

我的目标是在不重新加载页面的情况下实现实时数据操作。

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

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

附注我已经尝试过设置元标题

【问题讨论】:

  • 您能在 IE 的 Web 开发人员中看到在 ie8 中发出的 get 请求的缓存标头吗? GET 也会返回状态代码 200 或 304,或者更新时根本没有请求。

标签: internet-explorer caching angularjs cross-browser


【解决方案1】:

你可以设置

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

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;
            });
        };
    });   

【讨论】:

  • 非常感谢!!这个想法帮助了
  • @Avinash 似乎您也只使用了这个想法,但没有使用确切的解决方案,在我尝试之前不确定您的意思,并且必须自己进行不同的实现才能使其发挥作用。
【解决方案2】:

@Avinash 似乎您也只使用了这个想法,但没有使用确切的解决方案,在我尝试之前不确定您的意思,并且必须自己进行不同的实现才能使其发挥作用。

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

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

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

我的解决方案 :) 创建您传入的 $resource 时(网址、附加设置、方法)。在我传入 {'cacheSlayer':new Date().getTime()} 的附加设置中,它确实开始将它添加到我的资源 url 中。

希望对你有帮助

【讨论】:

  • tl;dr: $resource('/my/resource/:id', {id: "@id", cacheSlayer: new Date().getTime()}, { query: ...
【解决方案3】:

与上面提到的 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

【讨论】:

  • 还要注意 $httpProvider.requestInterceptors 现在是 $httpProvider.interceptors
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-02
  • 1970-01-01
相关资源
最近更新 更多