前回の続きで、Angularのアプリケーションを作成していきます。
Contents
StockService の作成
Angular CLIを使用して、StockServiceを作成します。
これはコンポーネントからデータ取得ロジックを切り離す為です。
データ取得ロジックを別に設けることによって、モックからではなく、外部やローカルからデータを取得して使うことができます。
但し、この記事ではモックを使用します。
user@computer$ ng generate service stock
Stockデータの取得
StockServiceをStockComponentで利用できるようにします。
Angularのstock.service.tsファイルに次を記述しましょう。
プロバイダーのメタデータを@Injectableデコレーターに含めることによって、サービスの ルートインジェクタ でプロバイダーを登録します。ルートアプリケーションインジェクターにサービスプロバイダーを追加すると、それはアプリケーション全体で使用することができます。
StocksComponentの更新
Angularのstocks.component.tsファイルを修正しましょう。
STOCKSのインポートを削除して、代わりにStockServiceをインポートしましょう。
import { StockService } from '../stock.service';
stocksプロパティの定義を、単純な宣言に置き換えます。
stocks: Stock[ ];
StockServiceの注入
stockServiceをコンストラクターに追加しましょう。
このパラメータはプライベートな stockServiceプロパティとして定義されると同時に、 StockServiceを注入すべき場所として認識されます。
constructor(private stockService: StockService) { }
getStocks() の追加
サービスからstockデータを取得するための関数を作成します。
ngOnInitでの呼び出し
getStocks( )はコンストラクターでも呼び出すことはできますが、これは最適な方法ではありません。コンストラクターではプロパティ定義などの簡単な初期化のみを行い、それ以外は 何もするべきではありません 。
各インターフェースは、名前が ngで始まるインターフェース名である単一のフックメソッドを持っています。 たとえば、 OnInitインターフェースは ngOnInit( )という名前のフックメソッドを持っています。 Angularはコンポーネントの作成直後に呼び出します。
Observable データ
StockService.getStocks( )は同期的なメソッドなので、StockServiceは即座にStockデータを取得できます。
しかし、実際のアプリケーションでは機能しません。
現在は、モックからデータを得ているからです。
StockService.getStocks( )は何らかの非同期処理を実装する必要があります。
非同期処理の実装には、コールバック関数、Promiseまたは Observableを使用できます。ここでは、StockService.getStocks( )は Observableを返します。 なぜなら、後にヒーローデータの取得で利用する Angular の HttpClient.get( )メソッドが Observableを返すからです。
Observable StockService
Observableおよび of を RxJS からインポートします。
RxJSの of( )関数を使ってサーバーからのデータの取得をシミュレートします。
getStocksメソッドを Observable形式で書き直しましょう。
Angularのstock.service.tsファイルに次を記述しましょう。
StocksComponent の Subscribe
StockService.getStocks メソッドは Stock[ ]を返していましたが、 現在の返り値は Observable<Stock[ ]>です。
そのため、それらの違いを修正する必要があるでしょう。
Angularのstocks.component.tsファイルを修正しましょう。
メッセージの表示
この節では次のことを行います。
-
メッセージを表示するための MessagesComponent を画面下部に追加する
-
表示するメッセージを送信するために、アプリケーション全体で注入可能な MessageServiceを作成する
-
StockService に MessageService を注入する
MessagesComponent の作成
Angular CLI を使い MessagesComponentを作成します。
user@computer$ ng generate component messages
Angularのapp.component.htmlに追加します。
<h1>{{title}}</h1>
<app-stocks></app-stocks>
<app-messages></app-messages>
MessageService の作成
Angular CLI を使い、MessageServiceを追加します。
user@computer$ ng generate service message
Angularのmessage.service.tsファイルを開き、次のように修正します。
StockServiceへの注入
stock.service.tsファイルに記述します。
StockServiceからのメッセージを表示する
messages.component.tsに記述します。
import { Component, OnInit } from '@angular/core';
import { MessageService } from '../message.service';
@Component({
selector: ‘app-messages’,
templateUrl: ‘./messages.component.html’,
styleUrls: [‘./messages.component.css’]
})
export class MessagesComponent implements OnInit {
constructor(public messageService: MessageService) { }
ngOnInit() {
}
}
MessageService へバインドする
Angular CLI によって生成されたmessages.component.htmlを開いて、記述しましょう。
このテンプレートは、コンポーネント内の messageService と直接紐付きます。
- *ngIfは、表示するメッセージが存在する場合のみメッセージエリアを表示します
- *ngFor は、<div> 要素をくり返してメッセージリストを表示します
- Angular の イベントバインディング は、ボタンのクリックイベントと MessageService.clear() を紐付けます
スタイルシートを適用します。
- /* MessagesComponent’s private CSS styles */
- h2 {
- color: red;
- font–family: Arial, Helvetica, sans–serif;
- font–weight: lighter;
- }
- body {
- margin: 2em;
- }
- body, input[text], button {
- color: crimson;
- font–family: Cambria, Georgia;
- }
- button.clear {
- font–family: Arial;
- background–color: #eee;
- border: none;
- padding: 5px 10px;
- border–radius: 4px;
- cursor: pointer;
- cursor: hand;
- }
- button:hover {
- background–color: #cfd8dc;
- }
- button:disabled {
- background–color: #eee;
- color: #aaa;
- cursor: auto;
- }
- button.clear {
- color: #888;
- margin–bottom: 12px;
- }
データ取得ロジックを切り離すために、StockServiceを作成しました。
stock.service.tsに記述しました。
stocks.component.tsを修正しました。
stockServiceをコンストラクターに追加しました。
getStocks( ) 関数を作成しました。
ngOnInit( )に追記しました。
import { Observable, of } from ‘rxjs’;をしました。
Subscribeを修正しました。
MessagesComponentを作成しました。
MessageServiceを作成しました。
stock.service.tsに変更を追記しました。
messages.component.tsに記述しました。
messages.component.htmlを記述しました。
messages.component.cssを記述しました。