AngularJS 控制器在 Firefox 和 IE 中缓存:如何禁用?
AngularJS controller is caching in Firefox and IE: how to disable?
在我的 angular 应用程序中,我有以下控制器(由于隐私政策,我删除了一些方法):
.controller('ArticleCtrl', ['$http', '$scope', '$location', '$localStorage', '$q', '$templateCache', 'authService',
'uploaderService', 'settings',
function($http, $scope, $location, $localStorage, $q, $templateCache, authService, uploaderService, settings) {
$scope.isAuth = authService.checkAuthStatus() || false;
if ($scope.isAuth == false) {
$location.path('/signin');
}
$scope.username = $localStorage.authStatus.userName;
$scope.getCompany = function(id) {
$http.get(settings.apiBaseUri + '/app/' + id, {
headers: {
'Content-Type': 'application/json',
'Cache-Control': 'no-cache'
}
})
.success(function(response) {
$scope.company = response;
$scope.company.Email = $scope.username;
})
.error(function(data, status, headers, config) {
console.log('operation failed, status: ' + data);
$location.path('/signin');
});
$scope.$apply();
};
if ($scope.isAuth == true) {
$scope.company = $localStorage.selectedCompany;
$templateCache.removeAll();
$scope.getCompany($localStorage.selectedCompany.Id);
}
}
]);
我花了很多时间,但我仍然不明白为什么只有这个控制器被缓存(其他控制器是通过复制粘贴制作的)。
但是当第一次调用此方法时:一切正常,在调试器中我看到它通过 GET 方法转到服务器,但是当我刷新页面时,然后再次转到此控制器 - 在 Firefox 中和 IE 我看到没有对服务器的新请求。但为什么?只有当我用 Ctrl + F5
刷新页面时一切正常。但是用户不会那样做,我需要有效的应用程序...
也许有人知道如何解决这个问题?如何禁用 angularjs 视图和控制器缓存?
UPD:
我看到更新后我的本地存储在 IE 和 Firefox 中没有改变。为什么?
首先确保id参数正确。其次确保请求 headers 具有 no-cache。可能你有请求拦截器,这个拦截器覆盖了 headers。在 firebug 中针对 firefox 跟踪此请求。
如果您看到 'no-cache' 值,请检查服务器。也许服务器可以缓存这个。
抱歉,我没有直接回答问题,但接下来的内容似乎很重要。
我和其他人现在强烈反对使用 ngStorage。
确实,ngStorage 看起来非常非常方便。你直接改变对象,voilà,一切正常。我用了一点,这很酷:)
但是,遗憾的是,当您尝试进行高级使用或查看源代码时,您会发现存在几个问题。这个很棒的 "immediate localStorage object modification" 是用 $rootScope 制作的。这对性能来说不是一个好主意。此外,您可能看到一些 GitHub issues 和您一样提出了类似的同步问题。另外,请注意该项目现在完全没有维护。在生产中使用这样的库是个坏主意。
所以,你可以尝试另一种解决方案,使link与localStorage,例如Angular Locker,越来越被使用。这将导致一些代码重构,但你未来的自己会感谢你没有使用有问题的库。
在我的 angular 应用程序中,我有以下控制器(由于隐私政策,我删除了一些方法):
.controller('ArticleCtrl', ['$http', '$scope', '$location', '$localStorage', '$q', '$templateCache', 'authService',
'uploaderService', 'settings',
function($http, $scope, $location, $localStorage, $q, $templateCache, authService, uploaderService, settings) {
$scope.isAuth = authService.checkAuthStatus() || false;
if ($scope.isAuth == false) {
$location.path('/signin');
}
$scope.username = $localStorage.authStatus.userName;
$scope.getCompany = function(id) {
$http.get(settings.apiBaseUri + '/app/' + id, {
headers: {
'Content-Type': 'application/json',
'Cache-Control': 'no-cache'
}
})
.success(function(response) {
$scope.company = response;
$scope.company.Email = $scope.username;
})
.error(function(data, status, headers, config) {
console.log('operation failed, status: ' + data);
$location.path('/signin');
});
$scope.$apply();
};
if ($scope.isAuth == true) {
$scope.company = $localStorage.selectedCompany;
$templateCache.removeAll();
$scope.getCompany($localStorage.selectedCompany.Id);
}
}
]);
我花了很多时间,但我仍然不明白为什么只有这个控制器被缓存(其他控制器是通过复制粘贴制作的)。
但是当第一次调用此方法时:一切正常,在调试器中我看到它通过 GET 方法转到服务器,但是当我刷新页面时,然后再次转到此控制器 - 在 Firefox 中和 IE 我看到没有对服务器的新请求。但为什么?只有当我用 Ctrl + F5
刷新页面时一切正常。但是用户不会那样做,我需要有效的应用程序...
也许有人知道如何解决这个问题?如何禁用 angularjs 视图和控制器缓存?
UPD: 我看到更新后我的本地存储在 IE 和 Firefox 中没有改变。为什么?
首先确保id参数正确。其次确保请求 headers 具有 no-cache。可能你有请求拦截器,这个拦截器覆盖了 headers。在 firebug 中针对 firefox 跟踪此请求。
如果您看到 'no-cache' 值,请检查服务器。也许服务器可以缓存这个。
抱歉,我没有直接回答问题,但接下来的内容似乎很重要。
我和其他人现在强烈反对使用 ngStorage。
确实,ngStorage 看起来非常非常方便。你直接改变对象,voilà,一切正常。我用了一点,这很酷:)
但是,遗憾的是,当您尝试进行高级使用或查看源代码时,您会发现存在几个问题。这个很棒的 "immediate localStorage object modification" 是用 $rootScope 制作的。这对性能来说不是一个好主意。此外,您可能看到一些 GitHub issues 和您一样提出了类似的同步问题。另外,请注意该项目现在完全没有维护。在生产中使用这样的库是个坏主意。
所以,你可以尝试另一种解决方案,使link与localStorage,例如Angular Locker,越来越被使用。这将导致一些代码重构,但你未来的自己会感谢你没有使用有问题的库。