Подтвердить что ты не робот

Принудительная перезагрузка шаблона директивы

Я работаю над приложением AngularJS с несколькими директивами. Шаблоны директив хранятся в отдельном html файле. При редактировании этого шаблона мой браузер не обнаруживает никаких изменений после перезагрузки и всегда использует кешированную версию. Любые другие изменения в исходном коде обнаруживаются и приводятся к перезагрузке.

Я думаю, проблема в том, что это $templateCache, который, по-видимому, используется AngularJS при загрузке шаблона.

Я нашел в исходном коде AngularJS 1.0.2 следующее из строки 4317, которое является частью файла compileTemplateUrl():

$http.get(origAsyncDirective.templateUrl, {cache: $templateCache})

Мне интересно, есть ли у кого-то еще такая проблема и есть ли способ сказать AngularJS, когда кешировать, а когда нет.

4b9b3361

Ответ 1

Кэш шаблонов хранится в вашем браузере, так как это приложение javascript. Вы можете вручную загрузить кеш $или остановить кеширование ваших шаблонов (как казалось бы, для производства кеш не будет проблемой), используя инструменты разработчика.

Для принудительной подачи кеша:

function Main($cache) {
    $cache.data['first.html'] = {value: 'First template'};
    $cache.data['second.html'] = {value: '<b>Second</b> template'};

}

Main.$inject = ['$xhr.cache'];​

Посмотрите, как это работает в fiddle.

Чтобы остановить ваш браузер от кеширования шаблонов (процитировано из этого Сообщение групп Google, об этой проблеме, точно):

Моя команда и я столкнулись с этой проблемой. Наше решение для разработка с использованием Chrome заключалась в том, чтобы открыть инструменты разработчика и выбрать шестерня в нижнем правом углу. Затем выберите "Сеть - Отключить кеш.

Это устранило все наши проблемы с частичным/шаблоном кэширования.

Ответ 2

Я знаю, что это старый вопрос, но здесь более простое исправление, хотя оно немного взломанно, оно работает для меня и не требует, чтобы вы что-то делали для $templateCache.

Всякий раз, когда я сталкиваюсь с этой проблемой (я вижу это в шаблонах директивы, но также и в статических файлах JSON), я добавляю параметр запроса в конец загружаемого URL, например:

...
templateUrl: "partials/template.html?1",
...

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

Ответ 3

app.controller('someCtrl', function ($scope, $cacheFactory, templateRequest)
{   
    $scope.refreshTemplate = function ()
    {
      var tpl = "<template name>";
      $cacheFactory.get('templates').remove(tpl);
      $templateRequest(tpl).then(function ok(){
          console.log("Template "+tpl+" loaded.");
      });
     }
   ...
  }

то при вызове функции refreshTemplate вы вызываете перезагрузку