离子 - 有一种方法可以在控制器方法中删除缓存吗?

时间:2015-04-12 18:29:56

标签: caching ionic

我知道如何为视图清除缓存:

  .state('app.list', {
    cache : false,
    url: "/lists/:listId",
    views: {
      'menuContent': {
        templateUrl: "templates/listDashboard.html",
        controller: 'listDashboardCtrl'
      }
    }
  })

,但我需要其他东西 - 在控制器方法中删除应用程序的所有缓存。怎么做?

3 个答案:

答案 0 :(得分:13)

我找到了一个解决方案,将clearCacheClearHistory换成$timeout。像这样的东西。

$scope.logout = function(){
      $location.path('/signin')
      $timeout(function () {
          $ionicHistory.clearCache();
          $ionicHistory.clearHistory();
          $log.debug('clearing cache')
      },300) 
}

编辑:更改超时秒数

答案 1 :(得分:2)

您可以使用 $ ionicHistory From documentation

  

clearCache()

     

删除每个ionNavView中的所有缓存视图。这样既可以从DOM中删除视图元素,也可以销毁它的范围。

listDashboardCtrl 中写下:

function listDashboardCtrl($scope, $ionicHistory){
  $ionicHistory.clearCache();
}

答案 2 :(得分:0)

这是一个老问题,但对于2017年或之后的任何人,我会解释实际发生的事情以及如何解决它:

$ ionicHistory.clearCache()的代码:

clearCache: function(stateIds) { return $timeout(function() { 
$ionicNavViewDelegate._instances.forEach(function(instance) { 
instance.clearCache(stateIds); }); }); }

因此,正如您所看到的,它需要1个参数cllaed stateIds,它是一个stateId数组。事实上,我努力发现stateId只不过是stateName。

所以,让我们走得更远。 $ ionicNavView.clearCache的代码,用于上面的行" instance.clearCache(stateIds)"是:

self.clearCache = function(stateIds) {
    var viewElements = $element.children();
    var viewElement, viewScope, x, l, y, eleIdentifier;

    for (x = 0, l = viewElements.length; x < l; x++) {
      viewElement = viewElements.eq(x);

      if (stateIds) {
        eleIdentifier = viewElement.data(DATA_ELE_IDENTIFIER);

        for (y = 0; y < stateIds.length; y++) {
          if (eleIdentifier === stateIds[y]) {
            $ionicViewSwitcher.destroyViewEle(viewElement);
          }
        }
        continue;
      }

      if (navViewAttr(viewElement) == VIEW_STATUS_CACHED) {
        $ionicViewSwitcher.destroyViewEle(viewElement);

      } else if (navViewAttr(viewElement) == VIEW_STATUS_ACTIVE) {
        viewScope = viewElement.scope();
        viewScope && viewScope.$broadcast('$ionicView.clearCache');
      }

    }
};

正如您在代码中看到的,此clearCache不会清除所有缓存,而是销毁所有与stateIds数组中的值匹配的缓存视图。如果没有参数,那么就必须破坏实际视图。

因此,仅使用Ionic方法的解决方案是将$ ionicHistory.clearCache()与数组中的所有州名称作为参数调用。

E.g: $ ionicHistory.clearCache([&#39; login&#39;,&#39; map&#39;,&#39; home&#39;]); 我不能相信任何Ionic开发人员之前没有挖过代码,或者错过了这个简单的datail。 我希望有人能利用这一点,即使是这么晚。

更新:为了说清楚,我想指出错误本身的位置(如果我们可以称之为bug),也许对开发者来说很方便:

self.clearCache = function(stateIds){

[...]

 var viewElements = $element.children();

} 整个功能的作用基本上是:

使用JQLite获取所有元素 循环元素 检查一个元素是否等于StateIds数组中的元素并将其销毁;转到下一个元素。 检查循环中的元素是否被缓存或激活,并且在两种情况下都将其销毁 我不会深入研究这个,但调试它我可以看到元素来自var viewElements = $ element.children();不是所有观看内容的数组,甚至不是缓存的内容,有意或无意地不会遍历所有状态以清除所有匹配的内容&#39; ACTIVE&#39;或者&#39; CACHED&#39;。如果您希望它遍历所有状态并销毁所有缓存的视图和数据,则需要明确传递stateIds数组参数。

除了另外一个奇怪的行为,因为当我调试它时,我看到var viewElements数组填充了2个元素,并且这两个元素来自相同的状态,一个解析为&#39; CACHED&#39;另一个解析器为&#39; ACTIVE&#39;,甚至解析为if条件中使用的2种类型,根本没有清除缓存。

我个人认为这是某种错误的实施或被错误地广泛使用。事实上,很多人都对此表示不满,而开发人员甚至没有给出这个简单的解释。