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