Избегайте кэширования частичных представлений angularJS в IE
Я работаю над приложением ASP.NET MVC, в котором также есть angularJS. У меня есть главная страница, на которой есть разные вкладки, которые при нажатии на них загружают частичное угловое представление. Вот так выглядит главная страница:
{ ... }
<div class="widget-div" ng-controller="mainController">
<div class="widget-body">
<div class="tabs-left">
<ul id="demo-pill-nav" class="nav nav-tabs tabs-left" style="width: 160px">
<li ng-class="getMenuClass('/search')">
<a href="javascript:void(0);" ng-click="selectPage('search')">Search</a>
</li>
<li ng-class="getMenuClass('/addressVerification')">
<a href="javascript:void(0);" ng-click="selectPage('addressVerification')">Address Verification</a>
</li>
<li ng-class="getMenuClass('/dashboard')">
<a href="javascript:void(0);" ng-click="selectPage('dashboard')">Dashboard</a>
</li>
<li ng-class="getMenuClass('/editProfile')">
<a href="javascript:void(0);" ng-click="selectPage('editProfile')">Update Profile</a>
</li>
</ul>
<div class="tab-content">
<div class="active tab-pane">
<ng:view />
</div>
</div>
</div>
</div>
</div>
{ ... }
В главном контроллере метод selectPage выглядит так:
$scope.selectPage = function (page) {
//not relevant code removed here
$location.path("/" + page);
};
И, конечно, я определил маршруты как:
$routeProvider.when("/search", {
templateUrl: "/Scripts/app/views/search.html"
});
Теперь мне нужны эти частичные представления, чтобы они не кэшировались, по крайней мере, в процессе разработки. Для этого я использовал метод, представленный здесь:
myApp.run(function($rootScope, $templateCache) {
$rootScope.$on('$viewContentLoaded', function() {
$templateCache.removeAll();
});
});
Это отлично работало, за исключением Internet Explorer, который всегда будет загружать кэшированную версию даже при нажатии Ctrl+F5.
Кроме того, я попытался установить заголовки HTTP в макете HTML, например:
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="-1" />
Но это не сработало.
Поэтому мой вопрос: есть ли способ избежать такого поведения?
2 ответа
Я нашел обходной путь, который именно то, что мне нужно. Добавление номера версии к маршруту, например:
$routeProvider.when("/search", {
templateUrl: "/Scripts/app/views/search.html" + version
});
где версия - это строка типа: ?v1.0.0
Таким образом, каждый раз, когда я делаю изменение, я просто меняю номер версии, и при нажатии на эту страницу частичное представление будет загружено снова.
Используйте тег ниже в web.config для отключения кеширования
<staticContent>
<clientCache cacheControlMode="DisableCache" />
</staticContent>