有没有可能在Ionic中清除视图caching?

我目前正在开发一个Angular / Ionic / Cordova项目,最近我们升级到了最新的Ionictesting版。 从项目之前使用的版本,这引入了视图caching。 但是,这样做也引发了一个问题。

该应用程序面向客户,非常以数据为中心。 然而,用户必须通过authentication才能查看与其账户相关的数据。 当用户注销并login到另一个帐户时,由于视图仍然被caching,因此会显示最后一个帐户的视图。

当用户login时,应用程序仍然应该caching视图,因为它有助于使应用程序感觉更快,但是当用户注销时应该清除caching。

设置cache-view="false"不是一个选项,因为它会完全禁用caching。

我也试过设置$ionicConfig.views.maxCache(0); 然后回到10的默认值,希望它能清除caching,但是没有效果。

我能想到的最后一件事是在用户login时触发一个事件,刷新当前加载到视图中的所有数据 – 但是,这需要比我觉得应该多一点努力。

有没有办法简单地清除视图caching?

在app.js中的状态定义中,您可以添加cache:false来禁用caching(请参阅在Ionic文档中禁用状态提供程序中的caching),或者除非知道数据已更改,否则可以保留caching。

  • 如果你已经在页面上,你可以这样做: $state.go($state.currentState, {}, {reload:true})
  • 如果你在另一个状态,并且想要回到通常被caching的状态,但是你希望它被刷新,你可以这样做, $ionicHistory.clearCache().then(function(){ $state.go('app.fooState') })

请注意,后者需要clearCache来返回一个承诺。 查看我在这个pull请求中所做的更改,并比较您现在使用的clearCache的实现: https : //github.com/driftyco/ionic/pull/3724

我偶然发现了一个类似的情况下,与另一个用户login显示过时/caching视图。 您可以在状态定义级别执行cache: false ,但完全禁用应用程序中该状态的caching。

当用户进入应用程序的login/login状态时(你说的),你可以做的是清除所有的caching视图和历史logging。 看起来很理想。

 // code inside your signin controller $scope.$on("$ionicView.enter", function () { $ionicHistory.clearCache(); $ionicHistory.clearHistory(); }); 

你也可以通过在$stateProvider设置cache:false$stateProvider

 $stateProvider.state('myState', { cache: false, url : '/myUrl', templateUrl : 'my-template.html' }) 

你在寻找这样的东西吗?

 $ionicHistory.clearCache(); 

编辑:

Ionic的github中存在一个问题: 问题

那么这是一个老问题,我将解释真正发生了什么,以及如何解决它:

PS:如果你想直接进入解决scheme,请立即向下滚动。

$ ionicHistory.clearCache()的代码:

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

所以,正如你所看到的,它需要一个参数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不会清除所有的CACHES,而是销毁所有与stateIds数组中的值相匹配的caching视图。 如果没有参数,那么只能破坏实际视图。

因此,使用Ionic方法的解决scheme是使用数组中的所有状态名称作为参数调用$ ionicHistory.clearCache()。

例如:SOLUTION $ ionicHistory.clearCache(['login','map','home']); 我不能相信任何Ionic开发者之前没有深入的代码,或者错过了这个简单的数据。 有很多人为此而痛苦。

为了清楚起见,我想指出错误本身在哪里(如果我们可以称之为错误),也许可以用于开发者:

self.clearCache = function(stateIds){

[…]

  var viewElements = $element.children(); 

}整个函数的function基本上是:

使用JQLite获取所有元素循环元素检查一个元素是否等于StateIds数组中的元素并将其销毁; 去下一个元素。 检查循环中的元素是caching还是活动,并在两种情况下销毁它我不会深入这个,但debugging它,我可以看到从元素var viewElements = $ element.children(); 不是所有视图内容的数组,甚至没有被caching的内容,有意或无意地遍历所有的状态来清除所有匹配'ACTIVE'或'CACHED'的内容。 如果你想循环遍历你所有的状态,并销毁所有caching的视图和数据,你需要明确地通过stateIds数组参数。

除此之外,还有一个奇怪的行为,因为当我debugging它时,我看到var viewElements数组被填充了2个元素,这两个元素来自同一个状态,一个解决'CACHED'另一个parsing器'ACTIVE',甚至解决了在这种情况下使用的两种typescaching未被清除的情况。

我个人认为这是一些错误的实施或被错误地广泛使用。 事实是,有很多人在这方面头脑发热,开发人员甚至没有给出这个简单的解释。