我知道如何为视图清除缓存:
.state('app.list', {
cache : false,
url: "/lists/:listId",
views: {
'menuContent': {
templateUrl: "templates/listDashboard.html",
controller: 'listDashboardCtrl'
}
}
})
,但我需要其他东西 - 在控制器方法中删除应用程序的所有缓存。怎么做?
答案 0 :(得分:13)
我找到了一个解决方案,将clearCache
和ClearHistory
换成$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种类型,根本没有清除缓存。
我个人认为这是某种错误的实施或被错误地广泛使用。事实上,很多人都对此表示不满,而开发人员甚至没有给出这个简单的解释。