Daiki Urata
Table of Contents
Nebular とは
Angular アプリを作るためのツール群で公式サイトでも言っているようにただの UI ツールキットを提供しているだけではなく、認証機構やセキュリティもカバーしてくれています。
UI コンポーネントも変わったものが多く、チャット画面の雛形 Chat UIを用意してくれていたりとかなり便利なものが揃っています。
今回はその UI コンポーネントを使って簡単なアプリを作りたいと思います。
どんなものができたかはデモがあるので、以下から確認できます。
https://goofy-swanson-b0b82b.netlify.com/
これは Nebular のFlip Card を使って実現しています。
Angular プロジェクト作成
$ ng new my-nebular-app
Nebular 導入
$ npm install @nebular/theme @angular/cdk @angular/animations
$ npm install @nebular/bootstrap bootstrap nebular-icons
モジュールを追加します。
// app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
// import nebular theme module
import { NbThemeModule } from '@nebular/theme';
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
// this will enable the default theme, you can change this by passing `{ name: 'cosmic' }` to enable the dark theme
NbThemeModule.forRoot()
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
スタイルを追加します。
{
...
"styles": [
"src/styles.css",
"node_modules/@nebular/theme/styles/prebuilt/default.css", // or cosmic.css
"node_modules/bootstrap/dist/css/bootstrap.css", // bootstrap styles
"node_modules/@nebular/bootstrap/styles/prebuilt/default.css",
"node_modules/nebular-icons/scss/nebular-icons.scss"
],
...
}
Router とフラッシュカード表示 Component を生成します。
$ ng generate module app-routing --flat --module=app
$ ng generate component FlashCards
// app-routing.module.ts
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { FlashCardsComponent } from './flash-cards/flash-cards.component';
const routes: Routes = [
{ path: '', component: FlashCardsComponent }
];
@NgModule({
imports: [ RouterModule.forRoot(routes) ],
exports: [ RouterModule ]
})
export class AppRoutingModule { }
// app.module.ts
...
import { NbLayoutModule, NbThemeModule } from '@nebular/theme';
import { FlashCardsComponent } from './flash-cards/flash-cards.component';
@NgModule({
declarations: [
AppComponent,
FlashCardsComponent
],
imports: [
...
NbLayoutModule
],
...
})
export class AppModule { }
// app.component.html
<nb-layout>
<nb-layout-header fixed>Flash Card App</nb-layout-header>
<nb-layout-column>
<router-outlet></router-outlet>
</nb-layout-column>
</nb-layout>
フラッシュカードページ
Class を作成します。
$ ng generate class FlashCardItem
// flash-card-item.ts
export class FlashCardItem {
constructor(
public id: number,
public front: string,
public back: string
) { }
}
フラッシュカードを作成/表示する画面コンポーネントを作成します。
// flash-cards.component.ts
import { Component, OnInit } from '@angular/core';
import { FlashCardItem } from '../flash-card-item';
@Component({
selector: 'app-flash-cards',
templateUrl: './flash-cards.component.html',
styleUrls: ['./flash-cards.component.css']
})
export class FlashCardsComponent implements OnInit {
items: Array<FlashCardItem>;
frontText: string;
backText: string;
constructor() {
this.items = [
new FlashCardItem(1, 'Front1', 'Back1' ),
new FlashCardItem(2, 'Front2', 'Back2' ),
new FlashCardItem(3, 'Front3', 'Back3' )
];
this.frontText = '';
this.backText = '';
}
ngOnInit() {}
onClickSave() {
this.items.push(new FlashCardItem(this.items.length + 1, this.frontText, this.backText));
}
}
<!-- flash-cards.component.html -->
<div>
<div class="row">
<nb-card class="w-100 m-3">
<nb-card-body class="text-center">
<input type="text" class="mb-3" nbInput fullWidth status="info" placeholder="Front" [(ngModel)]="frontText">
<input type="text" class="mb-3" nbInput fullWidth status="danger" placeholder="Back" [(ngModel)]="backText">
<button nbButton hero status="primary" class="w-50" (click)="onClickSave()">Save</button>
</nb-card-body>
</nb-card>
</div>
<div class="row" *ngFor="let item of items">
<div class="col">
<nb-flip-card>
<nb-card-front>
<nb-card accent="danger">
<nb-card-body>
{{ item.front }}
</nb-card-body>
</nb-card>
</nb-card-front>
<nb-card-back>
<nb-card>
<nb-card-body>
{{ item.back }}
</nb-card-body>
</nb-card>
</nb-card-back>
</nb-flip-card>
</div>
</div>
</div>
// app.module.ts
...
import { FormsModule } from '@angular/forms';
import { NbButtonModule, NbCardModule, NbInputModule, NbLayoutModule, NbThemeModule } from '@nebular/theme';
@NgModule({
...
imports: [
...
FormsModule,
NbCardModule,
NbInputModule,
NbButtonModule
],
...
})
export class AppModule { }
すると以下のような見た目になりました。
まとめ
今回は Nebular の提供する UI コンポーネントだけを使ってみましたが、次は Auth や Security の機能も使ってみたいと思います。