メニューの基礎
ここでは blank テンプレートで作成した、メニューのない単純な画面に典型的なメニューを設置する方法を、順を追って示します。
まずは blank テンプレートを用いて、新規プロジェクトを作成します。プロジェクト名は menu1 とします。
$ ionic start menu1 blank --v2
プロジェクトフォルダに移動して、Android プラットフォームを追加します。
$ cd menu1 $ ionic platform add android
この時点で、画面は次のようになります。
さて、これにメニューを追加します。
まずホームページ (HomePage, 上記画面) のヘッダー部分に、メニューを開くためのトグルボタンを追加します。
HomePage のテンプレート (src/pages/home/home.html) のヘッダー内に menuToggle ディレクティブ付きのボタンを設置します。
<ion-header>
<ion-navbar>
<button ion-button menuToggle>
<ion-icon name="menu"></ion-icon>
</button>
<ion-title>
Ionic Blank
</ion-title>
</ion-navbar>
</ion-header>
<ion-content padding>
...
これでトグルボタンが表示できます。
メニュー自体は src/app/app.html に記述します。 メニューは ion-menu として作成します。
<ion-menu [content]="c1">
<ion-header>
<ion-toolbar>
<ion-title>My Menu</ion-title>
</ion-toolbar>
</ion-header>
<ion-content>
<ion-list>
<button menuClose ion-item >Menu 1</button>
<button menuClose ion-item >Menu 2</button>
<button menuClose ion-item >Menu 3</button>
</ion-list>
</ion-content>
</ion-menu>
<ion-nav #c1 [root]="rootPage"></ion-nav>
メニューの出現方法は type 属性で指定できますが、プラットフォームによって適切なデフォルト値が設定されるので、 特に理由がない限り余計な設定をしない方が良いでしょう。
以上でトグルボタンを押したときに、次のようなメニューが表示されます。
さて、ここまででメニューは表示できましたが、メニュー項目を押しても何もしません。そこで、3ページを新規に作成して、 Menu 1, 2, 3 それぞれで、新しく作成する FooPage, BarPage, BazPage それぞれにジャンプしましょう。
ページを作成するには次のコマンドを実行します。
$ ionic g page fooPage $ ionic g page barPage $ ionic g page bazPage
ボタンにイベントハンドラをセットします。
<ion-menu [content]="c1">
<ion-header>
<ion-toolbar>
<ion-title>My Menu</ion-title>
</ion-toolbar>
</ion-header>
<ion-content>
<ion-list>
<button menuClose ion-item (click)="openPage('foo')">Menu 1</button>
<button menuClose ion-item (click)="openPage('bar')">Menu 2</button>
<button menuClose ion-item (click)="openPage('baz')">Menu 3</button>
</ion-list>
</ion-content>
</ion-menu>
<ion-nav #c1 [root]="rootPage"></ion-nav>
ハンドラ自体を記述します。
import { Component, ViewChild } from '@angular/core';
import { Nav, Platform } from 'ionic-angular';
import { StatusBar } from '@ionic-native/status-bar';
import { SplashScreen } from '@ionic-native/splash-screen';
import { HomePage } from '../pages/home/home';
import { FooPage } from '../pages/foo-page/foo-page';
import { BarPage } from '../pages/bar-page/bar-page';
import { BazPage } from '../pages/baz-page/baz-page';
@Component({
templateUrl: 'app.html'
})
export class MyApp {
@ViewChild(Nav) nav: Nav;
rootPage:any = HomePage;
constructor(platform: Platform, statusBar: StatusBar, splashScreen: SplashScreen) {
platform.ready().then(() => {
statusBar.styleDefault();
splashScreen.hide();
});
}
openPage(name: string){
switch(name){
case 'foo':
this.nav.setRoot(FooPage);
break;
case 'bar':
this.nav.setRoot(BarPage);
break;
case 'baz':
this.nav.setRoot(BazPage);
break;
}
}
}
イベントハンドラの設定については、「Angular のイベントバインディング」をみてください。また、 ChildView 修飾子については「@ViewChild を用いたコンポーネント」を参考にしてください。
@ChildView で Nav を取り込んでいますが、これは ion-nav の部分です。
Nav は NavController を拡張してます。すなわち、Nav は NavController です。
また、ルートモジュールに個々のページモジュールを追加します。
import { BrowserModule } from '@angular/platform-browser';
import { ErrorHandler, NgModule } from '@angular/core';
import { IonicApp, IonicErrorHandler, IonicModule } from 'ionic-angular';
import { SplashScreen } from '@ionic-native/splash-screen';
import { StatusBar } from '@ionic-native/status-bar';
import { MyApp } from './app.component';
import { HomePage } from '../pages/home/home';
import { FooPageModule } from '../pages/foo-page/foo-page.module';
import { BarPageModule } from '../pages/bar-page/bar-page.module';
import { BazPageModule } from '../pages/baz-page/baz-page.module';
@NgModule({
declarations: [
MyApp,
HomePage
],
imports: [
BrowserModule,
FooPageModule,
BarPageModule,
BazPageModule,
IonicModule.forRoot(MyApp)
],
bootstrap: [IonicApp],
entryComponents: [
MyApp,
HomePage
],
providers: [
StatusBar,
SplashScreen,
{provide: ErrorHandler, useClass: IonicErrorHandler}
]
})
export class AppModule {}
また、それぞれのページに HopePage に追加したのと同様にトグルボタンを設置します。
以上でメニュー項目をおしたときに、ページを遷移します。
上記が典型的なメニューの作成方法です。