当前位置: 首页 > 知识库问答 >
问题:

爱奥尼亚-有没有办法在控制器方法中删除缓存?

云季萌
2023-03-14

我知道如何清除缓存以供查看:

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

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

共有3个答案

马奇略
2023-03-14

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

$ion icHistory.clearCache()的代码:

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

如您所见,它采用1个参数cllaed stateId,这是一个stateId数组。事实上,我很难发现stateId只不过是stateName。

那么,让我们更深入一点。$ionicNavView的代码。“instance.clearCache(StateId)”上一行中使用的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并没有清除所有缓存,相反,它会销毁与StateID数组中的值匹配的所有缓存视图。如果没有参数,只会破坏实际视图。

所以解决这个问题的方法是使用Ionic方法调用$ion icHistory.clearCache(),将数组中的所有状态名称作为参数。

例如:$ion icHistory.clearCache(['login','map','home']);我无法相信任何Ionic开发人员之前没有深入研究代码,或者错过了这个简单的日期。我希望有人能利用这一点,即使是这么晚。

更新:为了明确起见,我想指出bug本身的位置(如果我们可以称之为bug),可能对开发人员来说很方便:

自己clearCache=函数(StateID){

[...]

 var viewElements = $element.children();

}整个功能的基本功能是:

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

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

我个人认为这是一种错误的实现或被广泛错误地使用。事实上,有很多人对此感到惊讶,开发人员甚至没有给出这个简单的解释。

赵钊
2023-03-14

您可以使用$ionicHistory。来自文档:

clearCache()

删除每个ion NavView中的所有缓存视图。这既从DOM中删除视图元素,又破坏它的范围。

在您的列表DashboardCtrl中写入以下内容:

function listDashboardCtrl($scope, $ionicHistory){
  $ionicHistory.clearCache();
}
郁烨
2023-03-14

我找到了一个解决方案,将clearCacheClearRiver包装在$timeout中。类似这样的东西。

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

编辑:更改超时秒数

 类似资料:
  • 我目前正在从事Angular/Ionic/Cordova项目,我们最近升级到了最新的Ionic测试版。从项目之前使用的版本来看,这引入了视图缓存。然而,这也带来了一个问题。 该应用程序面向客户,非常以数据为中心。但是,用户必须进行身份验证才能查看当前与其帐户关联的数据;当用户注销并登录到另一个帐户时,由于视图仍在缓存中,因此会显示上一个帐户的视图。 当用户登录时,应用程序仍应缓存视图,因为这有助于

  • 我使用ionic并将cordova更新为4.1.1版(从3.9.2开始)。除了我的控制台之外,几乎所有的东西都工作得很好。日志不再显示在xcode中。 有什么想法吗? $离子信息: Cordova CLI:6.2.0 Gulp版本:CLI版本1.2.1 Gulp本地:本地版本3.9.1 爱奥尼亚框架版本:1.0.1 爱奥尼亚CLI版本:1.7.16 爱奥尼亚应用程序库版本:0.7.3 ios部署版

  • 这是一个简单的应用程序: 从主页按ADD时,将显示New Ionic页面。 用户键入标题和内容后,按Add,列表中将添加一条注释,然后应用程序导航回主页。我所做的是:-创建添加注释页。-在添加注释中。ts,我返回主页,如下所示: } 在添加注释中。html我定义了如下按钮: 我尝试this.navCtrl.popToRoot()但它不工作。 有人知道原因吗?

  • 谷歌宣布,自2019年8月1日起,所有新应用程序和应用程序更新都必须提供64位版本和32位版本。我有一个Ionic 3(Cordova)应用程序,我不确定这会有什么影响。具体来说,爱奥尼亚/科尔多瓦应用程序需要做什么才能满足这一要求? 从2019年8月1日开始: 发布到Google Play时,除了32位版本外,所有包含本机代码的新应用和应用更新都必须提供64位版本。

  • 我想在Ionic4(角度7)中添加一个后退按钮。但我找不到合适的角度路由器方法。 <代码>从“@角度/路由器”导入{路由器} 在组件处理程序中单击按钮时如何返回?我想使用“@角度/路由器”而不是“@角度/公共”来实现它=

  • 我正试图使用这个工具将谷歌分析添加到一个Ionic/phonegap/Covdova应用程序中。然而,我发现了以下错误: 配置根项目“android”时出现问题。无法解析配置“:_debugCompile”的所有依赖项。找不到任何与com匹配的版本。谷歌。Android游戏服务s-analytics:。在以下位置搜索:https://repo1.maven.org/maven2/com/googl