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,越来越被使用。这将导致一些代码重构,但你未来的自己会感谢你没有使用有问题的库。