Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否可以在Ionic中清除视图缓存?_Javascript_Ionic - Fatal编程技术网

Javascript 是否可以在Ionic中清除视图缓存?

Javascript 是否可以在Ionic中清除视图缓存?,javascript,ionic,Javascript,Ionic,我目前正在从事Angular/Ionic/Cordova项目,我们最近升级到了最新的Ionic测试版。从项目以前使用的版本来看,这引入了视图缓存。然而,它在这样做的过程中也引入了一个问题 该应用程序面向客户,非常以数据为中心。但是,用户必须通过身份验证才能查看当前与其帐户关联的数据;当用户注销并登录到另一个帐户时,由于视图仍在缓存中,因此会显示上一个帐户的视图 当用户登录时,应用程序仍应缓存视图,因为这有助于让应用程序感觉更快,但当用户注销时,应清除缓存 设置cache view=“false”

我目前正在从事Angular/Ionic/Cordova项目,我们最近升级到了最新的Ionic测试版。从项目以前使用的版本来看,这引入了视图缓存。然而,它在这样做的过程中也引入了一个问题

该应用程序面向客户,非常以数据为中心。但是,用户必须通过身份验证才能查看当前与其帐户关联的数据;当用户注销并登录到另一个帐户时,由于视图仍在缓存中,因此会显示上一个帐户的视图

当用户登录时,应用程序仍应缓存视图,因为这有助于让应用程序感觉更快,但当用户注销时,应清除缓存

设置
cache view=“false”
不是一个选项,因为它将完全禁用缓存

我还尝试设置
$ionicConfig.views.maxCache(0)
我能想到的最后一件事是,当用户登录时触发一个事件,刷新当前加载到视图中的所有数据-但是,这需要比我认为应该做的更多的工作


有没有办法简单地清除视图缓存?

您正在搜索类似的内容吗?:

$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();