Javascript 是否可以在Ionic中清除视图缓存?
我目前正在从事Angular/Ionic/Cordova项目,我们最近升级到了最新的Ionic测试版。从项目以前使用的版本来看,这引入了视图缓存。然而,它在这样做的过程中也引入了一个问题 该应用程序面向客户,非常以数据为中心。但是,用户必须通过身份验证才能查看当前与其帐户关联的数据;当用户注销并登录到另一个帐户时,由于视图仍在缓存中,因此会显示上一个帐户的视图 当用户登录时,应用程序仍应缓存视图,因为这有助于让应用程序感觉更快,但当用户注销时,应清除缓存 设置Javascript 是否可以在Ionic中清除视图缓存?,javascript,ionic,Javascript,Ionic,我目前正在从事Angular/Ionic/Cordova项目,我们最近升级到了最新的Ionic测试版。从项目以前使用的版本来看,这引入了视图缓存。然而,它在这样做的过程中也引入了一个问题 该应用程序面向客户,非常以数据为中心。但是,用户必须通过身份验证才能查看当前与其帐户关联的数据;当用户注销并登录到另一个帐户时,由于视图仍在缓存中,因此会显示上一个帐户的视图 当用户登录时,应用程序仍应缓存视图,因为这有助于让应用程序感觉更快,但当用户注销时,应清除缓存 设置cache view=“false”
cache view=“false”
不是一个选项,因为它将完全禁用缓存
我还尝试设置$ionicConfig.views.maxCache(0)然后返回默认值10,希望这样做可以清除缓存,但没有效果
我能想到的最后一件事是,当用户登录时触发一个事件,刷新当前加载到视图中的所有数据-但是,这需要比我认为应该做的更多的工作
有没有办法简单地清除视图缓存?您正在搜索类似的内容吗?:
$ionicHistory.clearCache();
编辑:
爱奥尼亚的github存在一个问题:
在app.js的状态定义中,您可以添加缓存:false
以禁用缓存(请参见爱奥尼亚文档中的。或者,您可以保留缓存,除非您知道数据已更改
- 如果您已经在页面上,您可以执行,
$state.go($state.currentState,{},{reload:true})
- 如果您处于另一个状态,并且希望返回到正常缓存的状态,但希望刷新该状态,则可以执行,
$IonichStory.clearCache()。然后(function(){$state.go('app.fooState')})
请注意,后者要求clearCache返回一个承诺。请参阅我在这个pull请求中所做的更改,并将您现在使用的clearCache实现与我的进行比较:我偶然发现了一个类似的场景,其中与另一个用户登录时显示的是陈旧/缓存视图。您可以在状态定义下执行缓存:false
离子级别,但这会完全禁用应用程序中该状态的缓存
当用户进入应用程序的登录/登录状态(如您所说)时,您可以清除所有缓存的视图和历史记录。这似乎很理想
// code inside your signin controller
$scope.$on("$ionicView.enter", function () {
$ionicHistory.clearCache();
$ionicHistory.clearHistory();
});
您还可以通过在$stateProvider
中设置缓存:false
来完成此操作:
$stateProvider.state('myState', {
cache: false,
url : '/myUrl',
templateUrl : 'my-template.html'
})
这是一个老问题,我将解释到底发生了什么以及如何解决它:
注:如果你想直接进入解决方案,请立即向下滚动
$IonichStory.clearCache()的代码:
所以,正如您所看到的,它需要1个参数cllaed stateId,这是一个stateId数组
那么,让我们更深入一点。在“instance.clearCache(StateId)”上面一行中使用的$ionicNavView.clearCache的代码是:
}
整个功能的基本功能是:
使用JQLite获取所有元素
循环元素
检查StateID数组中的元素是否等于1并销毁它;转到下一个元素。
检查循环中的元素是缓存的还是活动的,并在这两种情况下销毁它
我不会对此进行更深入的研究,但通过调试,我可以看到从var viewElements=$element.children()获得的元素;不是所有视图内容的数组,甚至不是缓存内容的数组,无论有意与否,它都不会循环遍历所有状态以清除所有与“活动”或“缓存”匹配的状态。如果希望它循环遍历所有状态并销毁所有缓存视图和数据,则需要明确地传递stateIds数组参数
除此之外还有另一个奇怪的行为,因为当我调试它时,我看到var viewElements数组中填充了2个元素,这2个元素来自相同的状态,一个解析为“缓存”,另一个解析为“活动”,甚至解析为在缓存完全未清除的情况下使用的2种类型
我个人认为这是一种错误的实现或被广泛错误地使用。事实上,有很多人对此嗤之以鼻,开发人员甚至没有给出这个简单的解释。我也想看到这个问题的答案,因为这个更改扰乱了我的工作流程。我发现maxCache(0);方法仅禁用控制器的缓存(因此,无论何时使用控制器,都会重新启动控制器)。在Mac OSX上,到目前为止,我在Chrome上解决此问题的方法是右键单击“刷新”按钮并选择“Emtpy缓存和硬重新加载”。我偶然发现了一个场景,在注销后登录时总是显示一个白色页面。您的解决方案轻松修复了这个完全功能化和交互式的白色屏幕。太棒了。“后者”要点使我们的“切换帐户”用例变得非常简单。一行代码。非常感谢!注意:“后者”此处的解决方案清除除当前活动视图之外的所有视图。如果您还想清除活动视图,一个解决方案是:1.清除缓存,2.导航到要刷新的页面,3.再次清除缓存。例如,$IonicStory.clearCache()。然后(function(){$state.go('app.fooState')。然后(function()){$IonicStory.clearCache()}}
如果你的ionic clearCache函数没有返回承诺,你可以这样包装:$q.when($IonicStory.clearCache())。然后(function(){$state.go('app.fooState')}
`clearCache: function(stateIds) { return $timeout(function() {
$ionicNavViewDelegate._instances.forEach(function(instance) {
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');
}
}
};
var viewElements = $element.children();