Angularのドキュメントを読むと分かりずらいものがあります。
言葉ではわかりずらかったことでしょう。
今回はモジュールと、ルートコンポーネントの説明をします。
モジュールの考え方としてどの単位にするかは、いろいろな考え方があります。業務単位、機能単位などがあります。
どれもメリット、デメリットとがあります。
http://leben.mobi/blog/angular_1/javascript/
モジュール
下記の見本ソースは1個のアプリケーションモジュールの説明になります。
アプリケーションのルートモジュールとモジュールに関するメタデータを定義します。
※ルートモジュールとは、アプリケーションで最初に起動するモジュールです
※ルートコンポーネントとは、所属するモジュールの最初に起動するコンポーネントです。
import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { ReactiveFormsModule } from '@angular/forms'; import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http'; // used to create fake backend import { fakeBackendProvider } from './_helpers'; import { AppComponent } from './app.component'; import { routing } from './app.routing'; import { AlertComponent } from './_directives'; import { AuthGuard } from './_guards'; import { JwtInterceptor, ErrorInterceptor } from './_helpers'; import { AlertService, AuthenticationService, UserService } from './_services'; import { HomeComponent } from './home'; import { LoginComponent } from './login'; import { RegisterComponent } from './register'; @NgModule({ imports: [ BrowserModule, ReactiveFormsModule, HttpClientModule, routing ], declarations: [ AppComponent, AlertComponent, HomeComponent, LoginComponent, RegisterComponent ], providers: [ AuthGuard, AlertService, AuthenticationService, UserService, { provide: HTTP_INTERCEPTORS, useClass: JwtInterceptor, multi: true }, { provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor, multi: true }, // provider used to create fake backend fakeBackendProvider ], bootstrap: [AppComponent] }) export class AppModule { }
21行目:imports
このNgModuleで宣言されたコンポーネントテンプレートで必要とされる他のモジュールです。
通常、このパターンのインポートです。
27行目:declarations
このNgModuleに属するコンポーネント、ディレクティブ(タグの作成)およびパイプ(日付けなどの処理)です。
34行目:providers
このNgModuleが利用するサービスをアクセス可能にします
このソースはルートモジュールなのでexportsはありませんが、exportsを記入することによって他のモジュールでimportsをすることにより利用可能になります。
45行目:bootstrap
ルートコンポーネントを呼び出します。見本ではAppComponentを呼び出します。
ルートコンポーネント
テンプレート
<!-- main app container --> <div class="jumbotron"> <div class="container"> <div class="row"> <div class="col-sm-6 offset-sm-3"> <alert></alert> <router-outlet></router-outlet> </div> </div> </div> </div>
6行目:アラートのイベントタグ(ディレクティブ)です。
7行目:ルーティング処理が入ります。下記のルーティング処理が引き受けます。
ルートコンポーネント
import { Component } from '@angular/core'; @Component({ selector: 'app', templateUrl: 'app.component.html' }) export class AppComponent { }
index.htmlには<app></app>があります。
この「app」タグをルートモジュールでルートコンポーネントに定義されているコンポーネントによって、を利用することによって上記テンプレートの
「<!– main app container –> <div class=”jumbotron”>・・・」に置換されます。
ルーティング
import { Routes, RouterModule } from '@angular/router'; import { HomeComponent } from './home'; import { LoginComponent } from './login'; import { RegisterComponent } from './register'; import { AuthGuard } from './_guards'; const appRoutes: Routes = [ { path: '', component: HomeComponent, canActivate: [AuthGuard] }, { path: 'login', component: LoginComponent }, { path: 'register', component: RegisterComponent }, // otherwise redirect to home { path: '**', redirectTo: '' } ]; export const routing = RouterModule.forRoot(appRoutes);
<router-outlet></router-outlet>に埋め込まれる関係になります。
ルーティングはいろいろなやり方があります。
後日の記載に譲ります
9行目:ホームコンポーネントです。
canActivateによって認証が必要となり、ログインをしていなければ、表示されません。
10行目:ログイン画面に遷移します。
canActivateの機能により、ログインしていないユーザは、ログイン画面に遷移します。
後日、機能を説明します。
11行目:ユーザ登録画面に遷移します。
まとめ
モジュールの仕組みはメタデータの定義です。何を利用するかなど明確にします。
モジュールでは、ルートコンポーネントが定義されていおり、angularの処理の流れがわかります。
処理の流れがパターン化されているので、それに合わせると、Angularのアプリケーションは作りやすくなります。
また、認証が必要な場合のcanActivateの利用や、アラートの表示などはインターセプターの利用も定義できます。
これらの説明は後日になります。