Отключить кэширование шаблонов в AngularJS с помощью ui-router
Я заметил, что время от времени я внес изменения в один из шаблонов в моем приложении AngularJS, и что во время выполнения это изменение не будет видно. Скорее, мне нужно будет обновить приложение, и если это не удастся, перейдите на путь самого шаблона и обновите его, чтобы увидеть это изменение.
Какой лучший способ предотвратить кэширование этих шаблонов? В идеале я бы хотел, чтобы они были кэшированы во время текущего использования приложения Angular, но при следующем загрузке страницы они извлекают последние и самые большие шаблоны без необходимости вручную обновлять.
Я использую ui-router, если это имеет значение здесь. Спасибо!
Ответы
Ответ 1
Вы можете использовать декоратор и обновить UI Router $templateFactory, чтобы добавить суффикс в templateUrl
function configureTemplateFactory($provide) {
// Set a suffix outside the decorator function
var cacheBuster = Date.now().toString();
function templateFactoryDecorator($delegate) {
var fromUrl = angular.bind($delegate, $delegate.fromUrl);
$delegate.fromUrl = function (url, params) {
if (url !== null && angular.isDefined(url) && angular.isString(url)) {
url += (url.indexOf("?") === -1 ? "?" : "&");
url += "v=" + cacheBuster;
}
return fromUrl(url, params);
};
return $delegate;
}
$provide.decorator('$templateFactory', ['$delegate', templateFactoryDecorator]);
}
app.config(['$provide', configureTemplateFactory]);
Ответ 2
Выше решение было отличным и не работало для шаблонов URL
function templateUrl: function($stataParams) { return '/serverUrl?id=' + $stataParams.id + '&cid=' + $stataParams.cid; }
исправлено с помощью
function templateFactoryDecorator($delegate) {
var fromUrl = angular.bind($delegate, $delegate.fromUrl);
$delegate.fromUrl = function (url, params) {
if (url !== null && angular.isDefined(url)) {
if (typeof url == 'function') {
url = url.call(url, params);
}
if (angular.isString(url)) {
url += (url.indexOf("?") === -1 ? "?" : "&");
url += "v=" + Date.now().toString();
}
}
return fromUrl(url, params);
};
return $delegate;
}