这是我的代码
$scope.moveToHome= function(){
$ionicHistory.clearCache().then(function(){
$ionicHistory.clearHistory();
$state.go("app.home");
});
}
在我的应用中,我在离子导航视图中有四个视图。从上一个视图如果单击完成,我想转到包含新历史记录的主页。在调用moveToHome函数时,我想清除离子历史的所有当前历史。当我使用$ ionicHistory.clearCache()时,它正在清除所有历史预期的当前范围。当我再次来到最后一个视图时,它只显示最后的范围值。如果使用$ ionicHistory.history()它正在清除历史记录,但我可以移到后页。
答案 0 :(得分:2)
这是一个老问题,但对于2017年或之后的任何人,我将解释实际发生的事情以及如何解决它:
$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(['state1', 'state2', 'state3']).then(function(){$ionicHistory.clearHistory});
我无法相信任何Ionic开发人员之前没有挖过代码,或者错过了这个简单的数据。 我希望有人能利用这一点,即使是这么晚。
**只是为了说清楚,我想指出错误本身的位置(如果我们可以称之为bug),也许对于开发者来说可能很方便:
self.clearCache = function(stateIds){
[...]
var viewElements = $element.children();
}
整个功能的作用基本上是:
使用JQLite获取所有元素 循环元素 检查一个元素是否等于StateIds数组中的元素并将其销毁;转到下一个元素。 检查循环中的元素是否被缓存或激活,并且在两种情况下都将其销毁 我不会深入研究这个,但调试它我可以看到元素来自var viewElements = $ element.children();不是所有视图内容的数组,甚至不是缓存的内容,有意或无意地不会遍历所有状态以清除所有匹配“ACTIVE”或“CACHED”的状态。如果您希望它遍历所有状态并销毁所有缓存的视图和数据,则需要明确传递stateIds数组参数。
此外还有另一个奇怪的行为,因为当我调试它时,我看到var viewElements数组填充了2个元素,而这2个元素来自同一个状态,一个解析为'CACHED'另一个解析器'ACTIVE ',甚至解析为if条件中使用的2种类型,根本没有清除缓存。
我个人认为这是某种错误的实施或被错误地广泛使用。事实是,有很多人对此表示不满,开发人员甚至没有给出这个简单的解释。
答案 1 :(得分:1)
在app.js文件中,您必须为州提供条目,例如以下 -
>>> L = [1,2,1,3,4,2,1,4]
>>> from collections import Counter
>>> counts = Counter(L)
>>> counts
Counter({1: 3, 2: 2, 4: 2, 3: 1})
>>> L1 = [ [ _ ]*counts[_] for _ in counts.keys() ]
>>> L1
[[1, 1, 1], [2, 2], [3], [4, 4]]
使用&#34;缓存&#34;如果属性为false,则状态控制器将始终重新加载,即状态将重新加载/刷新。