【问题标题】:$ionicHistory.clearCache() is not clearing current scope$ionicHistory.clearCache() 没有清除当前范围
【发布时间】:2018-02-18 06:10:59
【问题描述】:

这是我的代码

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

在我的应用程序中,我在 ion-nav-view 中有四个视图。从最后一个视图如果单击完成,我想移动到具有新历史记录的主页。在调用 moveToHome 函数时,我想清除 ionichistory 的所有当前历史记录。当我使用 $ionicHistory.clearCache() 它正在清除所有历史期望当前范围。当我再次来到最后一个视图时,它只显示最后一个范围值。如果使用 $ionicHistory.history() 是清除历史记录,但我可以移动到最后一页。

【问题讨论】:

    标签: ionic-framework


    【解决方案1】:

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

    $ionicHistory.clearCache()的代码:

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

    所以,如您所见,它需要 1 个参数,即 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 开发人员之前没有深入研究过代码,或者错过了这个简单的数据。 我希望有人能利用这一点,即使来晚了。

    **为了清楚起见,我想指出错误本身的位置(如果我们可以称其为错误),也许对开发人员来说很方便:

    self.clearCache = function(stateIds){
    
    [...]
    
         var viewElements = $element.children();
    
    }
    

    整个函数的作用基本上是:

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

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

    我个人认为这是某种错误的实现或被错误地广泛使用。事实是,很多人对此都束手无策,而开发人员甚至没有给出这个简单的解释。

    【讨论】:

      【解决方案2】:

      在 app.js 文件中,您必须提供状态条目,如下所示-

      .state('login', {
          url: "/login",
          cache: false,
          templateUrl: "js/login/login.html",
          controller : ""
      })
      

      使用“缓存”属性为 false,状态控制器将始终重新加载,即状态将重新加载/刷新。

      【讨论】:

        猜你喜欢
        • 2011-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-20
        • 2013-02-06
        • 1970-01-01
        • 2018-02-19
        • 2019-04-09
        相关资源
        最近更新 更多