Angularチュートリアルをやる 3日目
■ 思ったこと
4年前ぐらいに買いっぱなしだった書籍「Angularアプリケーションプログラミング」を辞書のように使っていく!
【番外編】 Angularの概念
いまさらだが、やっぱこっからちゃんと見た方がいいよね(Angular 日本語ドキュメンテーション)
Angularとは
- HTMLとTypeScriptでSPA(=シングルページクライアントアプリケーション)を開発するためのフレームワーク
- 基本的な構成要素は、 NgModule で組織されたAngularコンポーネント・・NgModule ??
NgModule!?
@NgModule
デコレーターを付与されたクラスのこと- モジュールとは、Angularアプリを構成する部品(コンポーネント、サービス、ディレクティブ、パイプなど)をまとめた単位のこと
- Angularアプリは最低一個のモジュールが必要
- 起動時に呼ばれるのがルートモジュール(またはメインモジュール)
- とりあえずNgModule をインポートして
@NgModule
デコレーターで構成情報を付与すれば君も今日からモジュールだ!
Angularアプリケーションとは
- 常に1つの ルートモジュールと多くの 機能モジュール で構成されたもの!
デコレーター (@)
- Angularに構成情報を教えてあげるもの
- モジュール、コンポーネントやサービスなどのクラスに付与して使う
コンポーネント
- ページを構成するUI部品をまとめた単位のこと
- 起動時に呼ばれるのがルートコンポーネント(またはメインコンポーネント)
- Componentをインポートして
@Component
デコレーターで構成情報(紐づくビューとか)を付与すればよい - コンポーネントで使用したいデータはサービスから注入される
サービス
- コンポーネント間で共有したいデータやロジックを設定するクラス
- サービスクラスには
@Injectable()
デコレーターを付与して共有したいメソッドを定義する - これのいいところですが、コンポーネントがサービスクラスを実体化してインスタンス化…とかしなくても、サービスクラス使う宣言すればインスタンス化し放題なところです!
- そこら辺の仕組みはDIコンテナってやつがうまくやってくれている
- 依存関係(Dependency)の注入(injetion)なのでDI
■ 4. サービスの追加
今は配列にいろいろ直書きした仮データを表示しているが、この章ではモックサービスを利用していい感じにするらしい。
そもそもコンポーネント内では
データの取得や保存は行わぬ、コンポーネントはデータの受け渡しに専念せねばならぬのだ。なので、その他の処理はServiceクラスに任せよう!!
HeroServiceを作成しよう
ng generate service hero
ってやるとまたも良い感じにファイルが作成される。src/appの直下に出来るのがちょっとイヤ!今度はCREATE のみのようだ。
CREATE src/app/hero.service.spec.ts (347 bytes) CREATE src/app/hero.service.ts (133 bytes)
生成されたhero.service.ts
は@Injectable()
があらかじめ付与されていた、()の中に構成情報が書かれている。
デフォルトでprovidedIn: 'root'
となっているが、ここでは依存性の注入方法を宣言しており、ルート指定するとアプリケーション全体で使用できるみたい…むしろ、こうしないと使えないぜ!
データの取得
- データは例えばAPI、ローカルストレージ、モックデータなど色んなとこからやってくるが、サービスに取得ロジックを書いてあげればコンポーネントはただ受け取り屋さんになれるので便利!
- 今回は引き続きモックデータを使うので、
HEROES
をインポートし、取ってきた結果を入れるようの配列も必要なのでHero
もインポートする - あとはgetメソッドつくればOK!
getHeroes(): Hero[] { return HEROS; }
HeroesComponent の更新
- 上記の通りコンポーネントで直接データを取得する必要はないため、「2. リストの表示>ヒーローのモックを作成」で作ったモッククラスのインポートは削除する
- そんで、今作ったサービスをインポートする!
- Heroクラスはインポート済なので、もらったデータを
heroes
に設定できるように書き換える - このままではサービスはまだ使えない、サービスの注入を行おう
- コンストラクタを追加して、引数に
HeroService
を渡してあげればOK
constructor(private heroService: HeroService) {}
HeroesComponentでデータをゲット
- するには、注入されたサービスのgetメソッドを使いましょう
// サービスからheroesを取得 getHeros() { this.heroes = this.heroService.getHeroes(); }
- getメソッドはngOnInit()というメソッドで呼び出して使う、コンストラクタは使わないのか?オーキドのことば、ものにはつかいどころがあるんじゃ…!
ngOnInit()
ngOnInit(){ this.getHeros(); }
- ここまでやれば、画面が動く!
いったん整理
■ 感想
DI完全に理解した!!