【Ionic3】ModalCtrlに渡したPramsを外部から変更する
【やりたいこと】 1. ページ内でモーダル1を開く 2. モーダル1の上にモーダル2を開く 3. モーダル2で処理をして、モーダル1で処理したことを伝える
Modal Controllerに渡した変数の値を呼び出し元で更新してもモーダル内の値は更新されませんでした。
そこで、ModalControllerのインスタンスの値を直接変更することで対応しました。
Ionic的に推奨されるものではないと思いますけど、いい方法が思う浮かばなかったもので……。
// home.ts import { Component } from '@angular/core'; import { NavController, ModalController } from 'ionic-angular'; import { TranslationWidth } from '@angular/common'; import { Modal_1Page } from "../modal-1/modal-1"; import { Modal_2Page } from "../modal-2/modal-2"; @Component({ selector: 'page-home', templateUrl: 'home.html' }) export class HomePage { constructor(public navCtrl: NavController, public modalCtrl: ModalController) { } showModal1() { const modal = this.modalCtrl.create(Modal_1Page, { text: 'まだ完了していない', onDone: () => { this.showModal2(modal); } }); modal.present(); } showModal2(modal) { this.modalCtrl.create(Modal_2Page, { onDone: () => { modal.data.text = '完了'; } }).present(); } }
<!-- home.html --> <ion-header> <ion-navbar> <ion-title> Ionic Blank </ion-title> </ion-navbar> </ion-header> <ion-content padding> <p>モーダルを表示する</p> <button ion-button (click)="showModal1()">モーダル1表示</button> </ion-content>
// modal-1.ts import { Component } from '@angular/core'; import { IonicPage, NavController, NavParams, ViewController } from 'ionic-angular'; @IonicPage() @Component({ selector: 'page-modal-1', templateUrl: 'modal-1.html', }) export class Modal_1Page { onDone; text; constructor(public navCtrl: NavController, public navParams: NavParams, public viewCtrl: ViewController) { this.onDone = this.navParams.get('onDone'); } ionViewWillEnter() { this.text = this.navParams.get('text'); } done() { this.onDone(); } close() { this.viewCtrl.dismiss(); } }
<!-- modal-1.html --> <ion-header> <ion-navbar> <ion-title>modal-1</ion-title> </ion-navbar> </ion-header> <ion-content padding> <p>モーダル2の処理 : {{text}}</p> <button ion-button (click)="done()">モーダル2の処理</button> <button ion-button (click)="close()">閉じる</button> </ion-content>
// modal-2.ts import { Component } from '@angular/core'; import { IonicPage, NavController, NavParams, ViewController } from 'ionic-angular'; @IonicPage() @Component({ selector: 'page-modal-2', templateUrl: 'modal-2.html', }) export class Modal_2Page { onDone; text; constructor(public navCtrl: NavController, public navParams: NavParams, public viewCtrl: ViewController) { } ionViewWillEnter() { this.text = this.navParams.get('text') || '文字なし'; this.onDone = this.navParams.get('onDone'); } done() { this.onDone(); this.viewCtrl.dismiss(); } }
<!-- modal-2.html --> <ion-header> <ion-navbar> <ion-title>modal-2</ion-title> </ion-navbar> </ion-header> <ion-content padding> <p>モーダル2の処理</p> <button ion-button (click)="done()">処理完了</button> </ion-content>
modalCtrl.create(); のインスタンスの中にdataプロパティの中に、第二引数に渡したオブジェクトの情報が格納されています。
modal.data.text に新たな値を代入することで、modalの情報を外部から変更しています。
// home.ts showModal2(modal) { this.modalCtrl.create(Modal_2Page, { onDone: () => { // ↓情報を更新 modal.data.text = '完了'; } }).present(); }
modal-1.ts では、ionViewWillEnter() でモーダルがアクティブになる度に text の情報を取得するようにしています。
// modal-1.ts ionViewWillEnter() { this.text = this.navParams.get('text'); }
うーん。なにかこう、正攻法ではないような感じがメッチャありますね。