使用 Ionic 框架清除历史记录和重新加载登录/注销页面

我是新的移动应用程序开发与爱奥尼亚。在登录和注销时,我需要重新加载页面,以便刷新数据,但是,$state.go('mainPage')将用户带回到视图而不重新加载-它背后的控制器永远不会被调用。

有没有办法清除历史,重新装载爱奥尼亚州?

114930 次浏览

欢迎来到框架!实际上爱奥尼亚的路由是由 路由器驱动的。您可能应该检查一下 这个前面的 SO 问题,找到一些不同的方法来实现这一点。

如果只想重新加载状态,可以使用:

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

如果你真的想重新加载页面(比如,你想重新引导所有东西) ,那么你可以使用:

$window.location.reload(true)

祝你好运!

正确答案是:

$window.location.reload(true);

我发现 JimTheDev 的答案只有在州定义设置了 cache:false时才起作用。有了缓存的视图,如果要从一个状态导航到缓存但需要刷新的状态,那么可以执行 $ionicHistory.clearCache()$state.go('app.fooDestinationView')

在这里可以看到我的答案,因为它需要对 Ionic 进行一个简单的更改,我创建了一个 pull 请求: https://stackoverflow.com/a/30224972/756177

我已经找到了一个解决方案,帮助我完成它。设置 cache-view="false"ion-view标签解决了我的问题。

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

我试图做刷新页面使用 angularjs 当我看到网站我感到困惑,但没有代码为代码工作,然后我得到了解决方案重新加载页面使用

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

在这个函数中使用这个函数。

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

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

点击这里阅读 IonicView 生命周期:

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

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

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

我需要重新加载状态,使滚动条工作。他们没有工作时,通过另一个国家-“登记”。如果该应用程序在注册后被强制关闭并再次打开,即它直接进入“主”状态,滚动条工作。以上的解决方案都不管用。

注册后,我更换了:

$state.go("home");

window.location = "index.html";

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

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

$window.location.reload();

希望这个版本可以帮助其他像我这样的人坚持一段时间: 角度1.5.5,离子1.2.4,角度路由1.0

在我的例子中,我只需要清除视图并重新启动控制器。我可以通过这个片段得到我的意图:

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

缓存仍在工作,似乎只清除了视图。

ionic --version显示1.7.5。

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

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

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

当可能的重新加载过程完成后,我可以调用 $ionicLoading.hide()作为回调

最后,在 REFRESH 按钮中,我添加了 ng-click = "reload(params)"

这种解决方案的唯一缺点是您失去了离子导航历史系统

希望这个能帮上忙!

上面提到的所有解决方案都不适用于与 localhost不同的主机名!

$window.location.reload调用被调用之前,我必须将 notify: false添加到传递给 $state.go的选项列表中,以避免调用角度变化监听器。最终代码是这样的:

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

> > > 编辑-$超时可能是必要的,这取决于您的浏览器 > > >

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

< < < 编辑的结束 < < <

这里是 路由器引用台。

如果要在视图更改后重新加载,则需要

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

如果你想让这个视图成为新的“ root”你可以告诉 ionic 下一个视图就是 root

 $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) 缓存: false = = > 解决了我的问题!

正如@ezain 所指出的,只有在必要时才重新加载控制器。在更改状态而不是重新加载控制器时更新数据的另一种更简单的方法是使用广播事件,并在需要更新视图数据的控制器中监听这些事件。

例如: 在您的登录/注销函数中,您可以这样做:

$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");
};

现在,在 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 = '';
});