Принудительная перезагрузка шаблона директивы
Я работаю над приложением AngularJS с несколькими директивами. Шаблоны директив хранятся в отдельном html файле. При редактировании этого шаблона мой браузер не обнаруживает никаких изменений после перезагрузки и всегда использует кешированную версию. Любые другие изменения в исходном коде обнаруживаются и приводятся к перезагрузке.
Я думаю, проблема в том, что это $templateCache, который, по-видимому, используется AngularJS при загрузке шаблона.
Я нашел в исходном коде AngularJS 1.0.2 следующее из строки 4317, которое является частью файла compileTemplateUrl():
$http.get(origAsyncDirective.templateUrl, {cache: $templateCache})
Мне интересно, есть ли у кого-то еще такая проблема и есть ли способ сказать AngularJS, когда кешировать, а когда нет.
Ответы
Ответ 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 вы вызываете перезагрузку