アップデート
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
)を表示したいとします。
古い答え
これに数時間苦労した後、解決策を見つけました。
私が直面しなければならなかった1つの問題はionViewWillLeave
、が閉じられたときにも実行されるalert
ため、物事がより複雑になることです(view
戻るボタンを押したためにが閉じようとすると、が表示されますが、[ OKalert
]をクリックすると起動しますイベントを再び開き、再びイベントを開きます...)。alert
心に留めておくべきもう 1 つのことは、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
既に [OK] ボタンをクリックしたかどうかを確認します (そのため、ページを終了することを確認しました。これにより、次にionViewWillLeave
イベントが発生したときに を表示する必要がないことがわかりますalert
) 。
- この
exitPage
メソッドでは、最初に をスタックからthis.nav.remove()
削除し、alert
それが完了したらthis.nav.pop()
前のページに戻るために を実行します。