更新
从 Ionic2 RC 开始,现在我们可以使用 Nav Guards。
在某些情况下,开发人员应该能够控制视图离开和
进入。为此,NavController 具有 ionViewCanEnter 和
ionViewCanLeave 方法。类似于 Angular 2 路由守卫,但
与 NavController 更集成
所以现在我们可以这样做:
someMethod(): void {
// ...
this.showAlertMessage = true;
}
ionViewCanLeave() {
if(this.showAlertMessage) {
let alertPopup = this.alertCtrl.create({
title: 'Exit',
message: '¿Are you sure?',
buttons: [{
text: 'Exit',
handler: () => {
alertPopup.dismiss().then(() => {
this.exitPage();
});
}
},
{
text: 'Stay',
handler: () => {
// need to do something if the user stays?
}
}]
});
// Show the alert
alertPopup.present();
// Return false to avoid the page to be popped up
return false;
}
}
private exitPage() {
this.showAlertMessage = false;
this.navCtrl.pop();
}
我更喜欢使用this.showAlertMessage 属性,这样当用户尝试退出页面时,我们可以更好地控制何时需要显示警报。例如,我们可能在页面中有一个表单,如果用户没有进行任何更改,我们不想显示警报 (this.showAlertMessage = false),如果表单实际上已更改,我们希望显示警告(this.showAlertMessage = true)
老答案
经过几个小时的努力,我找到了解决方案。
我不得不面对的一个问题是ionViewWillLeave 也会在alert 关闭时执行,这使得事情变得更加复杂(当view 即将关闭时,因为您按下了返回按钮, alert 出现,但是当您单击 ok 时,会再次触发事件并再次打开 alert,依此类推...)。
要记住的另一件事是ActionSheets 和Alerts 被添加到navigation stack,所以this.nav.pop() 不是从堆栈中删除当前视图,而是删除alert(正因为如此我们可能会觉得它工作不正常)。
话虽如此,我找到的解决方案是:
import {Component} from '@angular/core';
import {NavController, NavParams, Alert} from 'ionic-angular';
@Component({
templateUrl: 'build/pages/mypage/mypage.html',
})
export class MyPage{
// ....
confirmedExit: boolean = false;
constructor(private nav: NavController, navParams: NavParams) {
// ...
}
ionViewWillLeave() {
if(!this.confirmedExit) {
let confirm = Alert.create({
title: 'Bye',
message: 'Now leaving',
buttons: [
{
text: 'Ok',
handler: () => {
this.exitPage();
}
}
]
});
this.nav.present(confirm);
}
}
public exitPage(){
this.confirmedExit = true;
this.nav.remove().then(() => {
this.nav.pop();
});
}
}
所以:
- 我使用
confirmedExit 变量来了解您是否已单击“确定”按钮(因此您确认要退出页面,并且我知道下次触发ionViewWillLeave 事件时,我不会'不必显示alert)
- 在
exitPage 方法中,首先我执行this.nav.remove() 以从堆栈中删除alert,完成后,我们执行this.nav.pop() 以返回上一页。