嗯,这是一个老问题,我将解释真正发生的事情以及如何解决它:
PS:如果您想直接进入解决方案,请立即向下滚动。
$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(['login', 'map', 'home']); 我无法相信任何 Ionic 开发人员之前没有深入研究代码,或者错过了这个简单的数据。有很多人为此感到痛苦。
为了清楚起见,我想指出错误本身的位置(如果我们可以称之为错误),也许对开发人员来说很方便:
self.clearCache = 函数(stateIds){
[...]
var viewElements = $element.children();
整个函数的作用基本上是:
使用 JQLite 获取所有元素 循环元素 检查 StateIds 数组中的元素是否等于 1 并销毁它;转到下一个元素。检查循环中的元素是否已缓存或处于活动状态,在两种真实情况下都将其销毁 不是所有视图内容的数组,甚至不是缓存的内容,无论是否有意,它都不会遍历所有状态以清除所有与“活动”或“缓存”匹配的状态。如果您希望它遍历所有状态并销毁所有缓存的视图和数据,则需要明确传递 stateIds 数组参数。
除此之外还有另一种奇怪的行为,因为当我调试它时,我看到 var viewElements 数组被 2 个元素填满,而这 2 个元素来自相同的状态,一个解析为 'CACHED' 另一个解析器为 'ACTIVE',甚至解析为 if 条件中使用的两种类型,缓存根本没有被清除。
我个人认为这是某种错误实施或被广泛错误使用。事实是,很多人对此嗤之以鼻,开发人员甚至没有给出这个简单的解释。