2013-08-08 3 views
3

Мой стек технологии -Как предотвратить кэширование в IE8 при использовании AngularJS Модели

  1. AngularJS
  2. Bootstrap
  3. Spring MVC
  4. Hibernate

Что я делаю:

Существует список предметов, на которых я d (Создание, чтение, обновление и удаление)

  1. Форма отправки данных через угловой контроллер в контроллер пружины.
  2. Spring Controller -> метод DAO -> БД обновляется
  3. Spring Controller Возвращает «Y» или «N»
  4. Угловая получает статус сообщения и перезагружает угловую модель (A Json Массив для заполнения Перечень предметов)
  5. То же самое с Update и Delete

Моя цель заключается в обеспечении манипулирования данными в режиме реального времени без перезагрузки страницы.

Это прекрасно работает в Chrome. Однако IE не может обнаружить изменение модели. Он продолжает отображать данные перед добавлением/обновлением/удалением (из своего кеша). Только после того, как я очистил кеш вручную, могу ли я увидеть измененную модель.

Нужна помощь в решении этой проблемы с IE8 и выше.

P.S. Я уже попытался установить мета заголовки

+0

Вы можете увидеть кэш-заголовки для запроса получения, сделанные в ie8 в веб-разработчике для IE. Кроме того, GET возвращает код состояния 200 или 304 или вообще не выполняется запрос на обновление. – Chandermani

ответ

5

Вы можете установить

«заголовки No-Cache для ответа на стороне сервера»

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

Спасибо большое! Эта идея помогла – Avinash

+0

@ Авинаш, похоже, вы использовали только идею, но не точное решение, не было уверенно, что вы имели в виду до тех пор, пока я ее не пробовал, и мне пришлось сделать другую реализацию, чтобы она работала. – agrublev

1

@A Винаш, похоже, вы использовали только идею, но не точное решение, не был уверен, что вы имели в виду до тех пор, пока я ее попробовал, и сам должен был сделать другую реализацию, чтобы она работала.

В любом случае я решил поделиться своими выводами с остальным миром, чтобы, возможно, сэкономить кому-то еще некоторое время.

Я попытался реализовать вышеприведенный код 1 для 1 ... первая очевидная проблема, с которой я столкнулся, заключается в том, что параметр запроса, переданный в обещание, имеет структуру объекта внутри, которая отличается от того, что показано выше, чтобы получить .method и .url мне нужно сначала перейти в .config. Так было request.config.method.

Но это не было основной проблемой, моя проблема заключалась в том, что даже после реализации этого окончательного URL-адреса не было добавлено кэш-память кеша.

Мое решение :) при создании ресурса $, который вы передаете (url, дополнительные настройки, метод). Внутри дополнительных настроек я перешел в {'cacheSlayer': new Date(). GetTime()}, и таким образом он начал добавлять это в свой ресурс url.

Надеется, что это помогает

+1

** tl; dr: ** '$ resource ('/ my/resource /: id', {id:" @id ", cacheSlayer: new Date(). GetTime()}, {query: ...' – Pakman

5

же, что сказан выше Jquery Гуру, но конфиг в новой версии углового

.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 после проверки

+1

Также обратите внимание, что $ httpProvider.requestInterceptors теперь $ httpProvider.interceptors – marcelj

Смежные вопросы