<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="http://organizeseries.com/"
	>

<channel>
	<title>Angular2で学ぶFirebase入門 &#8211; HTML5Experts.jp</title>
	<atom:link href="/series/firebase/feed/" rel="self" type="application/rss+xml" />
	<link>https://html5experts.jp</link>
	<description>日本に、もっとエキスパートを。</description>
	<lastBuildDate>Sat, 07 Jul 2018 03:14:05 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.7.19</generator>
	<item>
		<title>FirebaseとAngular2を使ってリアルタイムでデータのやり取り【導入編】</title>
		<link>/frontainer/19689/</link>
		<pubDate>Mon, 27 Jun 2016 00:00:18 +0000</pubDate>
		<dc:creator><![CDATA[林 優一]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[システム開発]]></category>
		<category><![CDATA[Angular2]]></category>
		<category><![CDATA[Firebase]]></category>

		<guid isPermaLink="false">/?p=19689</guid>
		<description><![CDATA[連載： Angular2で学ぶFirebase入門 (1)Firebaseはリアルタイム同期なデータベースを中心に、Auth認証やPushNotificationやユーザーの行動分析といったアプリケーションに最適な機能を...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/firebase/" class="series-379" title="Angular2で学ぶFirebase入門" data-wpel-link="internal">Angular2で学ぶFirebase入門</a> (1)</div><p>Firebaseはリアルタイム同期なデータベースを中心に、Auth認証やPushNotificationやユーザーの行動分析といったアプリケーションに最適な機能を提供するBasSです。先月行われたGoogle IOにて、PushNotificationや行動分析機能が追加されるなど話題となりました。</p>

<p>今回はFirebaseのリアルタイムベースとAngular2を用いて、リアルタイムにデータをやり取りする方法について解説します。</p>

<h2>Firebaseのリアルタイムデータベース</h2>

<p>Firebaseのリアルタイムデータベースはクラウドホスト型のNoSQLデータベースです。JSONの形式でデータは保存されます。
APIはもちろん、iOS/Android/Web用のSDKが提供されているので、非常に簡単に導入することができます。</p>

<p>また、ネットワークが途中で切れた場合は自動的に再接続を行い、復帰後に改めてデータが同期されます。同時100コネクション、1GBのデータ、10GBの転送量までは無料で使うことができるので、まず試してみるといったことができます。</p>

<p>今回はこの無料プランとAngular2を使って進めていきます。</p>

<h2>Angular CLIで環境構築</h2>

<p>Angular2の環境構築が初めての方でも簡単に導入できるように、Angular2ではCLIが公開されています。これを利用して環境を構築していきます。（※別途、Node.jsのインストールが必要です）</p>

<p><a href="https://github.com/angular/angular-cli" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">angular-cli</a></p>

<p>まずはnpmを使って、angular-cliをインストールします。</p>

<p></p><pre class="crayon-plain-tag">npm install -g angular-cli</pre><p></p>

<p>インストールが成功していれば、<code>ng version</code>でバージョンが表示されます。</p>

<p></p><pre class="crayon-plain-tag">angular-cli: 1.0.0-beta.5
node: 5.6.0
os: darwin x64</pre><p></p>

<p>続いて、<code>ng new</code>コマンドを用いてプロジェクトを作成します。newの後には任意のプロジェクト名を入力してください。（angularやfirebaseという名称を用いるとパッケージ名が重複してしまうため、関連ライブラリのインストールに失敗するのでご注意ください）</p>

<p></p><pre class="crayon-plain-tag">ng new sample
cd sample</pre><p></p>

<p>今回は<code>ng new sample</code>でプロジェクトを作成します。</p>

<p>sampleというフォルダができるので<code>cd sample</code>で移動し、この状態で <code>ng serve</code> コマンドを実行するとサンプルのアプリケーションがビルドされ、<code>http://localhost:4200/</code>にブラウザでアクセスすると<code>sample works!</code>と表示されます。</p>

<p>これで開発環境の準備が整いました。</p>

<h2>AngularFire導入</h2>

<p>本題のAngularFireを導入していきます。</p>

<p><a href="https://github.com/angular/angularfire2" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">angularfire2</a></p>

<p></p><pre class="crayon-plain-tag">npm install angularfire2 firebase@2.4.2 --save</pre><p></p>

<p>※ 6月14日現在の最新版は、firebase 2.4.2に対応しています。</p>

<p>続いて、firebase用の型定義ファイルをインストールします。
<code>typings</code>がインストールされていない場合は <code>npm i -g typings</code>を実行してインストールをしてください。</p>

<p></p><pre class="crayon-plain-tag">typings install dt~firebase --save --global</pre><p></p>

<p>※ 注意</p>

<p>typings 1系と0系では、コマンドやインストールされるファイルの構成が異なります。現在のバージョンのangular-cliでは0系でインストールされますが、npmでインストールされる最新版は1系になります。本稿では1系がインストールされている状態で解説を行います。0系の場合は以下のtypingsに追記する作業は必要ありません。</p>

<p><code>src/typings.d.ts</code>にインストールされたfirebaseの型定義ファイル群を追記します。</p>

<p></p><pre class="crayon-plain-tag">/// &lt;reference path="../typings/browser.d.ts" /&gt;
/// &lt;reference path="../typings/index.d.ts" /&gt;
declare var module: { id: string };</pre><p></p>

<p>angular-cli-build.jsを開き、<code>vendorNpmFiles</code>に<code>'angularfire2/**/*.js'</code> <code>'firebase/lib/*.js'</code> を追記します。</p>

<p></p><pre class="crayon-plain-tag">var Angular2App = require('angular-cli/lib/broccoli/angular2-app');

module.exports = function(defaults) {
  return new Angular2App(defaults, {
    vendorNpmFiles: [
      'systemjs/dist/system-polyfills.js',
      'systemjs/dist/system.src.js',
      'zone.js/dist/**/*.+(js|js.map)',
      'es6-shim/es6-shim.js',
      'reflect-metadata/**/*.+(js|js.map)',
      'rxjs/**/*.+(js|js.map)',
      '@angular/**/*.+(js|js.map)',
      'angularfire2/**/*.js', // &lt;- 追加
      'firebase/lib/*.js'      // &lt;- 追加
    ]
  });
};</pre><p></p>

<p>続いて、/src/system-config.tsに以下のようにfirebase,angularfire2の記述を追記します。</p>

<p></p><pre class="crayon-plain-tag">/** Map relative paths to URLs. */
const map: any = {
  'firebase': 'vendor/firebase/lib/firebase-web.js',
  'angularfire2': 'vendor/angularfire2'
};

/** User packages configuration. */
const packages: any = {
  angularfire2: {
    defaultExtension: 'js',
    main: 'angularfire2.js'
  }
}</pre><p></p>

<p>これでAngular2でFirebaseを使う準備が整いました。</p>

<h2>Firebaseの登録</h2>

<p>続いて、Firebaseの登録と設定を行っていきましょう。</p>

<p><a href="https://firebase.google.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">firebase</a></p>

<p><img src="/wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.46.07-640x194.png" alt="Screen Shot 0028-06-14 at 22.46.07" width="640" height="194" class="alignnone size-large wp-image-19695" srcset="/wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.46.07.png 640w, /wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.46.07-300x91.png 300w, /wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.46.07-207x63.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>FirebaseはGoogleアカウントで登録することができます。登録が完了すると、プロジェクトを作るためのボタンが表示されます。</p>

<p><img src="/wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.47.30-640x235.png" alt="Screen Shot 0028-06-14 at 22.47.30" width="640" height="235" class="alignnone size-large wp-image-19696" srcset="/wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.47.30.png 640w, /wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.47.30-300x110.png 300w, /wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.47.30-207x76.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>「新規プロジェクトを作成」ボタンをクリックして、アプリケーションを作成しましょう。</p>

<p><img src="/wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.48.17.png" alt="Screen Shot 0028-06-14 at 22.48.17" width="449" height="445" class="alignnone size-full wp-image-19697" srcset="/wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.48.17.png 449w, /wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.48.17-150x150.png 150w, /wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.48.17-300x297.png 300w, /wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.48.17-207x205.png 207w" sizes="(max-width: 449px) 100vw, 449px" /></p>

<p>アプリケーションが作成できたら「Database」ページを開きます。
以下のように、まだデータベースには何も入っていません。まずはこの画面から初期データを登録してみましょう。</p>

<p><img src="/wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.55.35.png" alt="Screen Shot 0028-06-14 at 22.55.35" width="294" height="57" class="alignnone size-full wp-image-19698" srcset="/wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.55.35.png 294w, /wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.55.35-207x40.png 207w" sizes="(max-width: 294px) 100vw, 294px" /></p>

<p>このようにデータを作成しました。</p>

<p></p><pre class="crayon-plain-tag">{
  items: {
    0: {
      value: &#039;item0001&#039;
    },
    2: {
      value: &#039;item0002&#039;
    },
    2: {
      value: &#039;item0003&#039;
    }
  }
}</pre><p></p>

<p>Firebase上では、すべてオブジェクトの形式でデータが構成されるようにしておきます。</p>

<p>続いて、「ルール」のタブをクリックしてルールを設定します。
ルールはデータベースへの値に対してのアクセス権の設定を行うことができます。JSONの形式でデータを定義していきます。</p>

<p><img src="/wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.58.07-640x333.png" alt="Screen Shot 0028-06-14 at 22.58.07" width="640" height="333" class="alignnone size-large wp-image-19699" srcset="/wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.58.07.png 640w, /wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.58.07-300x156.png 300w, /wp-content/uploads/2016/06/Screen-Shot-0028-06-14-at-22.58.07-207x108.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>詳しいルールの記載は、以下のページに説明があります。
<a href="https://html5exp-sample.firebaseio.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">https://html5exp-sample.firebaseio.com/</a></p>

<p>ここではサンプルということで、読み書きともに誰からでもできるように設定しておきましょう。</p>

<p></p><pre class="crayon-plain-tag">{
  "rules": {
    "items": {
      ".read": "true",
      ".write": "true"
    }
  }
}</pre><p></p>

<p>これによってデータベースの<code>items</code>以下は、読み書きともに誰でも許可されるようになりました。では、これで登録したデータが読み取れるか試してみましょう。/src/main.tsを開きます。</p>

<p></p><pre class="crayon-plain-tag">import { bootstrap } from '@angular/platform-browser-dynamic';
import { enableProdMode } from '@angular/core';
import { SampleAppComponent, environment } from './app/';
import { FIREBASE_PROVIDERS, defaultFirebase } from 'angularfire2'; // &lt;- add

if (environment.production) {
  enableProdMode();
}

bootstrap(SampleAppComponent,[
  FIREBASE_PROVIDERS, // &lt;- add
  defaultFirebase('https://&lt;your-firebase-app&gt;.firebaseio.com/') // &lt;- add
]);</pre><p></p>

<p><code>main.ts</code> にangularfire2のファイルをimportし、bootstrap関数の第２引数に<code>FIREBASE_PROVIDERS</code>と <code>defaultFirebase('https://.firebaseio.com/')</code> を配列で渡しておきます。</p>

<p>こうすることによって、今後Angular2のコンポーネント内でFirebaseに必要な設定とプロバイダが提供されるようになります。</p>

<p>続いて、画面にデータを表示するためのコンポーネントに変更を加えます。</p>

<p></p><pre class="crayon-plain-tag">import { Component } from '@angular/core';
import { AngularFire, FirebaseListObservable } from 'angularfire2'; //&lt;- add

@Component({
  moduleId: module.id,
  selector: 'sample-app',
  templateUrl: 'sample.component.html',
  styleUrls: ['sample.component.css']
})
export class SampleAppComponent {
  title = 'sample works!';
  items: FirebaseListObservable&lt;any[]&gt;;
  constructor(af: AngularFire) {
		this.items = af.database.list('/items');
  }
}</pre><p></p>

<p></p><pre class="crayon-plain-tag">&lt;h1&gt;{{title}}&lt;/h1&gt;
&lt;ul *ngFor="let item of items | async"&gt;
  &lt;li class="text"&gt;
    {{item.value}}
  &lt;/li&gt;
&lt;/ul&gt;</pre><p></p>

<p><code>*ngFor="let item of items | async"</code> のasyncはAsyncPipeと呼ばれるAngular2にはじめから組み込まれているPipeのひとつです。これはitemsのObservableをsubscribeしたときの引数を自動的に取得して表示してくれるPipeです。詳しい使い方や解説は以下のページにありますので、こちらをご一読ください。</p>

<p><a href="https://angular.io/docs/ts/latest/guide/pipes.html#!#async-pipe" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Async Pipe</a></p>

<p><code>ng serve</code> コマンドを改めて実行すると、Firebaseで登録されたデータが表示されるようになります。</p>

<h2>データの追加</h2>

<p>次にブラウザからデータを追加する処理を実装していきましょう。</p>

<p></p><pre class="crayon-plain-tag">export class SampleAppComponent {
  title = 'sample works!';
  items: FirebaseListObservable&lt;any[]&gt;;
  constructor(af: AngularFire) {
    this.items = af.database.list('/items');
  }
  addItem(value:string) {
    this.items.push({value:value});
  }
}</pre><p></p>

<p></p><pre class="crayon-plain-tag">&lt;h1&gt;{{title}}&lt;/h1&gt;
&lt;ul *ngFor="let item of items | async"&gt;
  &lt;li class="text"&gt;
    {{item.value}}
  &lt;/li&gt;
&lt;/ul&gt;

&lt;form (ngSubmit)="addItem(newItem.value);newItem.value=''"&gt;
  &lt;input type="text" #newItem&gt;
  &lt;button&gt;send&lt;/button&gt;
&lt;/form&gt;</pre><p></p>

<p><code>FirebaseListObservable</code>にデータを<code>push</code>するだけで配列データにデータを追加することができます。</p>

<h2>データの更新</h2>

<p>今度はリストのデータを更新してみましょう。</p>

<p></p><pre class="crayon-plain-tag">export class SampleAppComponent {
  title = 'sample works!';
  items: FirebaseListObservable&lt;any[]&gt;;
  constructor(af: AngularFire) {
    this.items = af.database.list('/items');
  }
  addItem(value:string) {
    this.items.push({value:value});
  }
  updateItem(key:string,value:string) {
	  this.items.update(key,{value:value});
  }
}</pre><p></p>

<p></p><pre class="crayon-plain-tag">&lt;h1&gt;{{title}}&lt;/h1&gt;
&lt;ul *ngFor="let item of items | async"&gt;
  &lt;li class="text"&gt;
    {{item.value}}
    &lt;input [(ngModel)]="item.value" (keyup)="updateItem(item.$key,item.value)"/&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;form (ngSubmit)="addItem(newItem.value);newItem.value=''"&gt;
  &lt;input type="text" #newItem&gt;
  &lt;button&gt;send&lt;/button&gt;
&lt;/form&gt;</pre><p></p>

<p><code>this.items.update(key,{value:value});</code>のように更新したいデータの$keyと値を渡すことで更新ができます。
Firebaseのオブジェクトには$keyというプロパティがあり、各データのKey名を取得することができます。
pushで追加されたデータは、一意なKeyが自動で振られるようになっています。</p>

<h2>データの削除</h2>

<p>続いて、リストのデータを削除してみましょう。</p>

<p></p><pre class="crayon-plain-tag">export class SampleAppComponent {
  title = 'sample works!';
  items: FirebaseListObservable&lt;any[]&gt;;
  constructor(af: AngularFire) {
    this.items = af.database.list('/items');
  }
  addItem(value:string) {
    this.items.push({value:value});
  }
  updateItem(key:string,value:string) {
	  this.items.update(key,{value:value});
  }
  deleteItem(key:string) {
	  this.items.remove(key);
  }
  deleteAll() {
	  this.items.remove();
  }
}</pre><p></p>

<p></p><pre class="crayon-plain-tag">&lt;h1&gt;{{title}}&lt;/h1&gt;
&lt;ul *ngFor="let item of items | async"&gt;
  &lt;li class="text"&gt;
    {{item.value}}
    &lt;input [(ngModel)]="item.value" (keyup)="updateItem(item.$key,item.value)"/&gt;
    
    &lt;button (click)="removeItem(item.$key)"&gt;削除&lt;/button&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;form (ngSubmit)="addItem(newItem.value);newItem.value=''"&gt;
  &lt;input type="text" #newItem&gt;
  &lt;button&gt;send&lt;/button&gt;
&lt;/form&gt;

&lt;button (click)="removeAll()"&gt;全削除&lt;/button&gt;</pre><p></p>

<p>更新と同様に<code>this.items.remove(key);</code>と削除したいデータのKeyを渡すことで、そのデータのみを削除することができます。</p>

<p><code>this.items.remove();</code>とKeyを渡さずにremoveするとリスト全体が削除されるので注意してください。</p>

<p>このように非常に簡単にデータの読み書きが実装できてしまいます。</p>

<h2>オブジェクトデータの取り扱い</h2>

<p>続いて、今度はリストデータでなく単一のオブジェクトのデータを扱ってみましょう。Firebaseの管理画面でDatabaseのデータに以下のような<code>constants</code>を追加しました。</p>

<p></p><pre class="crayon-plain-tag">{
  constants: {
    title: "My first firebase app"
  },
  items: {
    ...
  }
}</pre><p></p>

<p>ルール設定ページにいき、constantsは読み込み専用に設定しておきます。</p>

<p></p><pre class="crayon-plain-tag">{
  "rules": {
    "constants": {
      ".read": "true",
      ".write": "false"
    },
    "items": {
      ".read": "true",
      ".write": "true"
    }
  }
}</pre><p></p>

<p>src/app/sample.component.tsを、以下のように修正します。</p>

<p></p><pre class="crayon-plain-tag">import { Component } from '@angular/core';
import { AngularFire, FirebaseListObservable, FirebaseObjectObservable } from 'angularfire2'; //&lt;- add

@Component({
  moduleId: module.id,
  selector: 'sample-app',
  templateUrl: 'sample.component.html',
  styleUrls: ['sample.component.css']
})
export class SampleAppComponent {
  constants: FirebaseObjectObservable&lt;any&gt;;
  items: FirebaseListObservable&lt;any[]&gt;;
  constructor(af: AngularFire) {
    this.constants = af.database.object('/constants');
    this.items = af.database.list('/items');
  }
  addItem(value:string) {
    this.items.push({value:value});
  }
  updateItem(key:string,value:string) {
    this.items.update(key,{value:value});
  }
  deleteItem(key:string) {
    this.items.remove(key);
  }
  deleteAll() {
    this.items.remove();
  }
}</pre><p></p>

<p>そして、ビューのタイトル部分をconstantsから取得して表示させるようにします。</p>

<p></p><pre class="crayon-plain-tag">&lt;h1&gt;{{(constants | async)?.title}}&lt;/h1&gt;
&lt;ul *ngFor="let item of items | async"&gt;
  &lt;li class="text"&gt;
    &lt;input [(ngModel)]="item.value" (keyup)="updateItem(item.$key,item.value)"/&gt;

    &lt;button (click)="deleteItem(item.$key)"&gt;削除&lt;/button&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;form (ngSubmit)="addItem(newItem.value);newItem.value=''"&gt;
  &lt;input type="text" #newItem&gt;
  &lt;button&gt;send&lt;/button&gt;
&lt;/form&gt;

&lt;button (click)="deleteAll()"&gt;全削除&lt;/button&gt;</pre><p></p>

<p>こうすることで、オブジェクトのデータを読み込んで画面に表示させることができました。</p>

<h2>オブジェクトの更新</h2>

<p>オブジェクトの更新をする際は、リストと同様にupdate関数を用いて変更を行うことができます。その時にはルールで書き込みが許可されている必要があります。</p>

<p></p><pre class="crayon-plain-tag">this.constants.update({title:"new title"});</pre><p></p>

<h2>オブジェクトの削除</h2>

<p>オブジェクトの削除を行う際にはremove関数を用いますが、以下のようにremoveするとconstantsごと削除されます。</p>

<p></p><pre class="crayon-plain-tag">this.constants.remove(); // constantsごと削除</pre><p></p>

<p>１つのプロパティのみを削除したい場合は、以下のように削除したいプロパティまで取得した上でremove関数を実行します。</p>

<p></p><pre class="crayon-plain-tag">af.database.object('/constants/title').remove(); //titleだけ削除</pre><p></p>

<h2>まとめ</h2>

<p>このようにAngular2とFirebaseを使うことで、簡単にリアルタイムにデータのやり取りを行うことができるようになります。</p>

<p>今回はサンプルということで誰でも読み書きできる形にしていますが、ユーザー認証をFirebaseで作ったり、既にあるログイン情報を利用して認証させたりできるので、新規でも追加でも導入しやすくなっています。</p>

<p>次回はその認証機能を用いてログインすると書き込みができるようにしていきたいと思います。</p>
]]></content:encoded>
		
		<series:name><![CDATA[Angular2で学ぶFirebase入門]]></series:name>
	</item>
	</channel>
</rss>
