基于现在语言框架技术更新较快,很多功能的实现都不能按以前老旧的做法去完成了,本人在实际开发中也经常遇到这样的场景,所以一方面记录一下自己的做法,同时也希望给跟我一样遇到类似问题的小伙伴提供一点小小的帮助。
*问题/需求*:**ionic、platform实现系统返回功能,并解决退出时存在路由回退的多余行为**
-
1.系统回退功能做法:
关键方法:navigator[‘app’].exitApp();关键代码如下:
initializeApp() {
this.platform.ready().then(() => {
this.statusBar.styleDefault();
this.splashScreen.hide();
});
}
// 实体返回 退出程序
lastTimeBackPress = 0;
timePeriodToExit = 1000;
backButtonEvent() {
this.platform.backButton.subscribe(() => {
// alert(this.router.url);
if (this.router.url == '/login' || this.router.url == '/tabs/home' || this.router.url == '/tabs/newsletter' || this.router.url == '/tabs/myinfo') {
if ( new Date().getTime() - this.lastTimeBackPress < this.timePeriodToExit) {
navigator['app'].exitApp();
} else {
this.presentAlertConfirm();
this.lastTimeBackPress = new Date().getTime();
}
}
});
}
完整贴图:
采用这种做法时你会发现这个过程中存在一个多余的行为,就是在按系统返回键时,app在退出动作完成之前,会进行多余的路由回退到登录界面的行为。但是大部分产品都会在意这一点,要求取消这一多余行为,本人的做法如下:
import {Injectable} from '@angular/core';
import {ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot} from '@angular/router';
import { NavController } from '@ionic/angular';
@Injectable({
providedIn: 'root'
})
export class LoginGuard implements CanActivate {
constructor(private navCtl: NavController) {}
canActivate(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot ): boolean {
const token = localStorage.getItem('token');
if (token == null || token === undefined) {
// this.navCtl.navigateForward('login');
return true;
}
return false;
}
}
其实也就是给登录页面加一个路由守卫,以上是注册路由守卫的代码。这个做法是让已登录用户不能回退到登录界面,但是可以通过退出登录按钮跳转到登录界面。
当然不止这一种做法,大家可以采用自己觉得更合适的做法。