清除历史logging和使用Ionic Frameworklogin/注销重新加载页面

我是Ionic开发移动应用程序的新手。 在login和注销时,我需要重新加载页面,以刷新数据,但是, $state.go('mainPage')将用户带回到视图而不重新加载 – 它后面的控制器从不被调用。

有没有办法清除历史并重新载入离子状态?

欢迎来到框架! 实际上,Ionic中的路由由ui-router驱动 。 你应该看看这个以前的SO问题 ,find几个不同的方法来完成这个。

如果你只是想重新加载你可以使用的状态:

 $state.go($state.current, {}, {reload: true}); 

如果你真的想重新加载页面(如,你想重新启动一切),那么你可以使用:

 $window.location.reload(true) 

祝你好运!

我发现JimTheDev的答案只有在状态定义有cache:false时才起作用cache:false set。 在caching视图的情况下,如果您从一个状态导航到caching但需要刷新的状态,则可以执行$ionicHistory.clearCache() ,然后执行$state.go('app.fooDestinationView')

看到我的答案在这里,因为它需要一个简单的改变离子,我创build了一个拉请求: https : //stackoverflow.com/a/30224972/756177

我find了一个解决scheme,帮助我完成。 在ion-view标签上设置cache-view="false"解决了我的问题。

 <ion-view cache-view="false" view-title="My Title!"> .... </ion-view> 

正确答案:

 $window.location.reload(true); 

重新加载页面不是最好的方法。

您可以处理重新加载数据的状态更改事件,而无需重新加载视图本身。

在这里阅读关于ionicView生命周期

http://blog.ionic.io/navigating-the-changes/

并在input数据重新加载之前处理事件。

 $scope.$on('$ionicView.beforeEnter', function(){ // Any thing you can think of }); 

在我的情况下,我需要清除视图,然后重新启动控制器。 我可以得到这个片段的意图:

 $ionicHistory.clearCache([$state.current.name]).then(function() { $state.reload(); } 

caching仍在工作,似乎只是视图被清除。

ionic --version说1.7.5。

上面提到的解决scheme都不适用于与localhost不同的主机名!

为了避免在调用$window.location.reload调用之前调用Angular变更侦听器,我必须将notify: false添加到传递给$state.go的选项列表中。 最终的代码如下所示:

$state.go('home', {}, {reload: true, notify: false});

>>>编辑 – $超时可能需要取决于您的浏览器>>>

$timeout(function () { $window.location.reload(true); }, 100);

<<<编辑结束<<<

关于ui-router参考的更多信息。

我正在尝试刷新页面使用angularjs当我看到网站我感到困惑,但没有代码工作的代码,然后我得到了重新加载页面的解决scheme

 $state.go('path',null,{reload:true}); 

使用这个function,这将工作。

我需要重新加载状态,使滚动条工作。 当他们通过另一个国家 – “注册”时,他们不工作。 如果应用程序在注册后被强制closures并再次打开,即直接进入“home”状态,则滚动条工作。 没有上述解决scheme的工作。

在注册后,我换了:

 $state.go("home"); 

 window.location = "index.html"; 

应用程序重新加载,滚动条工作。

控制器只被调用一次,你应该保留这个逻辑模型,我通常做的是:

我创build了一个方法$scope.reload(params)

在这个方法的开始,我调用$ionicLoading.show({template:..})来显示我的自定义微调

什么时候重新加载过程完成,我可以调用$ionicLoading.hide()作为callback

最后,在buttonREFRESH里面,我添加ng-click = "reload(params)"

这个解决scheme唯一的缺点是你失去了离子导航历史系统

希望这可以帮助!

如果你想在查看改变后重新加载,你需要

 $state.reload('state',{reload:true}); 

如果你想让这个观点成为新的“根”,你可以告诉离子,下一个观点就是根

  $ionicHistory.nextViewOptions({ historyRoot: true }); $state.go('app.xxx'); return; 

如果您想在每次更改视图后重新加载控制器

 app.config(function ($stateProvider, $urlRouterProvider, $ionicConfigProvider) { $ionicConfigProvider.views.maxCache(0); 

.state(url:'/ url',controller:Ctl,templateUrl:'template.html',cache:false)cache:false ==>解决了我的问题!

正如@ezain所指出的那样,只有在必要时才能重新加载控制器。 在更改状态而不是重新加载控制器时更新数据的另一种更清洁的方式是使用广播事件并在需要更新视图上的数据的控制器中侦听此类事件。

例如:在你的login/注销function,你可以做这样的事情:

 $scope.login = function(){ //After login logic then send a broadcast $rootScope.$broadcast("user-logged-in"); $state.go("mainPage"); }; $scope.logout = function(){ //After logout logic then send a broadcast $rootScope.$broadcast("user-logged-out"); $state.go("mainPage"); }; 

现在在你的主页面控制器中,通过使用$ on函数来触发视图中的变化来监听mainPage控制器中的广播,如下所示:

 $scope.$on("user-logged-in", function(){ //update mainPage view data here eg. $scope.username = 'John'; }); $scope.$on("user-logged-out", function(){ //update mainPage view data here eg. $scope.username = ''; }); 

我尝试了很多方法,但是发现这个方法是绝对正确的:

 $window.location.reload(); 

希望这个帮助别人像我一样用版本卡住:angular 1.5.5,ionic 1.2.4,angular-ui-router 1.0.0