$ ionicHistory.clearCache()未清除当前范围

时间:2016-11-05 11:28:10

标签: ionic-framework

这是我的代码

$scope.moveToHome= function(){
   $ionicHistory.clearCache().then(function(){
      $ionicHistory.clearHistory();
        $state.go("app.home");
    });
}

在我的应用中,我在离子导航视图中有四个视图。从上一个视图如果单击完成,我想转到包含新历史记录的主页。在调用moveToHome函数时,我想清除离子历史的所有当前历史。当我使用$ ionicHistory.clearCache()时,它正在清除所有历史预期的当前范围。当我再次来到最后一个视图时,它只显示最后的范围值。如果使用$ ionicHistory.history()它正在清除历史记录,但我可以移到后页。

2 个答案:

答案 0 :(得分:2)

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

$ionicHistory.clearCache()的代码:

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

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

所以,让我们更深入一点。在“instance.clearCache(stateIds)”上面的行中使用的$ionicNavView.clearCache代码是:

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()

例如:解决方案

$ionicHistory.clearCache(['state1', 'state2', 'state3']).then(function(){$ionicHistory.clearHistory});

我无法相信任何Ionic开发人员之前没有挖过代码,或者错过了这个简单的数据。 我希望有人能利用这一点,即使是这么晚。

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

self.clearCache = function(stateIds){

[...]

     var viewElements = $element.children();

}

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

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

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

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

答案 1 :(得分:1)

在app.js文件中,您必须为州提供条目,例如以下 -

>>> L = [1,2,1,3,4,2,1,4]
>>> from collections import Counter
>>> counts = Counter(L)
>>> counts
Counter({1: 3, 2: 2, 4: 2, 3: 1})
>>> L1 = [ [ _ ]*counts[_] for _ in counts.keys() ]
>>> L1
[[1, 1, 1], [2, 2], [3], [4, 4]]

使用&#34;缓存&#34;如果属性为false,则状态控制器将始终重新加载,即状态将重新加载/刷新。