<?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/"
	>

<channel>
	<title>Angular | ビズドットオンライン</title>
	<atom:link href="https://it-biz.online/tag/angular/feed/" rel="self" type="application/rss+xml" />
	<link>https://it-biz.online</link>
	<description></description>
	<lastBuildDate>Wed, 23 Apr 2025 07:31:02 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>

<image>
	<url>https://it-biz.online/wp-content/uploads/2019/10/cropped-4a332f05ade4ac7bb3c46c472cb5eac8-32x32.png</url>
	<title>Angular | ビズドットオンライン</title>
	<link>https://it-biz.online</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【Angular】ルーティングの仕組みを１からわかりやすく</title>
		<link>https://it-biz.online/web-design/angular-routing/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Mon, 18 Mar 2024 08:19:12 +0000</pubDate>
				<category><![CDATA[TypeScript]]></category>
		<category><![CDATA[WEBデザイン]]></category>
		<category><![CDATA[Angular]]></category>
		<category><![CDATA[Web開発]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=9010</guid>

					<description><![CDATA[Angularのルーティングは、シングルページアプリケーション（SPA）でのページ遷移を管理する重要な機能です。 目次 Angular：ルーティングとは？Angularでのルーティング設定Angular：&#60;rout [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><a href="https://it-biz.online/web-design/what-is-angular/">Angular</a>のルーティングは、シングルページアプリケーション（SPA）での<strong><span class="marker-under">ページ遷移を管理する重要な機能</span></strong>です。</p>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">Angularにおける「ルーティング」とは？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p>Angularにおけるルーティングとはアプリケーション内でユーザーが異なるページやセクションに移動する際の道案内のようなもの。Angularでは実際にページを「移動する」のではなく「<strong>ページの内容を書き換える</strong>」ことでページが遷移したかのように見せる技術を採用しています。</p>
</div></dd></dl></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>？？？となってしまった方でも１から理解できるように前提の前提から理解できるようにわかりやすく解説します。</p>
</div></div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">Angular：ルーティングとは？</a></li><li><a href="#toc2" tabindex="0">Angularでのルーティング設定</a></li><li><a href="#toc3" tabindex="0">Angular：&lt;router-outlet&gt;とは何か？</a></li><li><a href="#toc4" tabindex="0">ナビゲーションとリンク</a><ol><li><a href="#toc5" tabindex="0">ナビゲーションリンク（routerLinkディレクティブ）</a></li><li><a href="#toc6" tabindex="0">プログラムによるナビゲーション（Routerサービス）</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">Angular：ルーティングとは？</span></h2>



<p>Angularのルーティングは、<strong>Webアプリケーション内でのページ遷移（＝実際にはページを遷移するのではなく、今見ているページの内容を書き換える）を制御する仕組み</strong>。</p>



<figure class="wp-block-image aligncenter size-full"><img fetchpriority="high" decoding="async" width="643" height="478" src="https://it-biz.online/wp-content/uploads/2024/03/image-20.png" alt="Angular ルーティング" class="wp-image-9022" srcset="https://it-biz.online/wp-content/uploads/2024/03/image-20.png 643w, https://it-biz.online/wp-content/uploads/2024/03/image-20-500x372.png 500w, https://it-biz.online/wp-content/uploads/2024/03/image-20-300x223.png 300w" sizes="(max-width: 643px) 100vw, 643px" /><figcaption class="wp-element-caption">図1：ルーティングイメージ</figcaption></figure>



<p>通常のWebアプリケーションでは複数のページ（ユーザ情報表示用ページ、トップページ、レポートページなど）があり、リンクをたどることでそれぞれのページに遷移していくのですが、AngularはSPA（<strong>シングルページ</strong>アプリケーション）なのでそのような動作はしません。</p>



<p>シングルページアプリケーション（SPA）では、従来のWebサイトのようにページを全て読み込み直して表示するのではなく、必要なデータやコンポーネントのみを動的に読み込むことでページの内容を更新します。つまり、ここでいう「ページ遷移」とは、実際にはページをまたいで移動するのではなく、<strong><span class="marker-under">単一のページ内で表示内容を切り替えることを指します。</span></strong></p>



<p>この方法を採用することで、リンクをクリックするたびに発生する全画面の読み込みを待つことなく、<strong>ほぼ即座に新しいコンテンツを見ることができるようになります</strong>。また、このページ遷移のプロセスはブラウザの履歴管理と連携しているので、ユーザーがブラウザの「戻る」や「進む」ボタンを使用しても、適切なコンテンツが表示されるようにできている点が特徴です。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>Angularでは別のページに移動しているわけではなく、１つのページ内で表示を変えている！ってのを理解できればOKです。</p>
</div></div>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box not-nested-style cocoon-block-tab-caption-box"><div class="tab-caption-box-label block-box-label box-label fab-lightbulb"><span class="tab-caption-box-label-text block-box-label-text box-label-text">ネットワークのルーティングとの違い</span></div><div class="tab-caption-box-content block-box-content box-content">
<p>ネットワークのルーティングはインターネットやその他のネットワーク上でデータパケットが目的地に到達するための最適な経路を選択するプロセス。</p>



<p>これに対して、Angularのルーティングは、Webアプリケーション内の異なるビュー間の移動を管理するためのもので、主にクライアントサイド（ユーザーのブラウザ上）で処理されます。</p>
</div></div>



<p>それでは、ここから具体的な実装方法を見ていきます。Angularではどのようにページ遷移を実現しているのか？という点に注目してください。</p>



<h2 class="wp-block-heading"><span id="toc2">Angularでのルーティング設定</span></h2>



<p>Angularでのルーティング設定を４ステップにわけて説明します。ざっくり言うと、ルーティング用のモジュール（ここにはURLと表示するコンポーネントの紐づけ情報を保持）を作って、そのモジュールをアプリケーションモジュールにImportするという手順です。</p>



<p class="is-style-border-left-box has-box-style"><span class="badge-green">ステップ１</span>　<strong>ルーティングモジュールの作成</strong></p>



<p>Angular CLIを使用して、ルーティングモジュールを作成します。このモジュールは、ルート（<strong>URLパターンとそれに対応する<a href="https://it-biz.online/web-design/ng-generate-component/">Angularコンポーネント</a>のマッピング</strong>）の定義を保持します。</p>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">Angular CLIとは？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p>Angularアプリケーションの開発を助けるためのコマンドラインツール。Angular CLIは、新しいプロジェクトの生成、アプリケーションの開発サーバーの起動、コードのテスト、アプリケーションのビルドやデプロイなど、開発プロセスの多くの側面を自動化し、簡単に行えるように設計されています。</p>
</div></dd></dl></div>



<p>コマンドは以下の通り。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">ng generate module app-routing --flat --module=app</pre>



<ol class="wp-block-list">
<li><span class="bold-blue"><code>--flat</code>フラグ</span>
<ul class="wp-block-list">
<li class="is-style-bottom-margin-1em has-bottom-margin">新しいフォルダを作成せずにファイルをプロジェクトのルートに直接置くことを指定。</li>
</ul>
</li>



<li><code><span class="bold-blue">--module=app</span></code>
<ul class="wp-block-list">
<li>新しく生成されたルーティングモジュールをアプリケーションのルートモジュールに自動的にインポートするように指定。</li>
</ul>
</li>
</ol>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>このフラグは必要に応じて書き換えてください。</p>
</div></div>



<p class="is-style-border-left-box has-box-style"><span class="badge-green">ステップ２</span>　<strong>ルートの定義</strong></p>



<p>ルーティングモジュール（例: <code>app-routing.module.ts</code>）内で、<code><span class="blue">Routes</span></code>型の配列を定義し、各ルートを設定します。<code><span class="blue">Routes</span></code>型は<code><strong><span class="marker-under">@angular/router</span></strong></code>からインポートされます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import { Routes, RouterModule } from '@angular/router';
import { HomeComponent } from './home/home.component'; // 例としてHomeComponentをインポート
import { AboutComponent } from './about/about.component'; // AboutComponentも例として

const routes: Routes = [
  { path: 'home', component: HomeComponent },
  { path: 'about', component: AboutComponent },
  // その他のルート定義...
];</pre>



<p>↑の配列は<code><span class="blue">path</span></code>と<code><span class="blue">component</span></code>プロパティを持ちます。<code><span class="blue">path</span></code>はURLの一部。<code><span class="blue">component</span></code>にはそのURLが指定されたときに表示されるコンポーネントを指定します。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>/home を含むURLを押したときに「HomeComponent」を表示するよ！ということ。</p>
</div></div>



<p class="is-style-border-left-box has-box-style"><span class="badge-green">ステップ３</span>　<strong>RouterModuleのインポートと設定</strong></p>



<p>次に、<code><span class="blue">RouterModule</span></code>をルーティングモジュールにインポートし、<code>forRoot()</code>メソッドを使ってアプリケーションのルートルートを設定します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }</pre>



<ul class="wp-block-list">
<li class="is-style-bottom-margin-2em has-bottom-margin"><code><span class="blue">imports</span></code>配列で<code><span class="blue">RouterModule.forRoot(routes)</span></code>を呼び出すことにより、先ほど定義したルートがアプリケーションに登録されます。</li>



<li><code><span class="blue">exports</span></code>配列に<code><span class="blue">RouterModule</span></code>を含めることで、ルーティング機能がアプリケーションの他の部分から利用可能になります。</li>
</ul>



<p class="is-style-border-left-box has-box-style"><span class="badge-green">ステップ４</span>　<strong>アプリケーションモジュールにルーティングモジュールをインポート</strong></p>



<p>最後に、<code><span class="blue">AppRoutingModule</span></code>をアプリケーションのルートモジュール（通常は<code>app.module.ts</code>）にインポートします。これは、Angular CLIを使用してルーティングモジュールを生成した場合、自動的に行われることが多いですが、手動で行う必要がある場合もあります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import { AppRoutingModule } from './app-routing.module'; // AppRoutingModuleのインポート

@NgModule({
  // ...
  imports: [
    // ...
    AppRoutingModule // ルーティングモジュールをインポート
  ],
  // ...
})
export class AppModule { }</pre>



<p>これで、ルーティングの基本設定は完了。実はそんなに難しいことはしていません。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>が、Angularのルーティングはここからが本番です。ページを切り替えたときにどのコンポーネントを表示するか？は決まったものの、どこに表示するか？を決められていません。</p>
</div></div>



<p>続いては、ルーターアウトレット（<code><strong><span class="marker-under">router-outlet</span></strong></code>）についてご説明します。</p>



<h2 class="wp-block-heading"><span id="toc3">Angular：&lt;router-outlet&gt;とは何か？</span></h2>



<p><code>&lt;router-outlet&gt;</code>は、テンプレート内に配置されるディレクティブ（指示子）で、<strong><span class="marker-under">Angularが動的にコンポーネントを表示する場所</span></strong>を表します。</p>



<p>つまり、URLに基づいて、コンポーネントをこの<code>&lt;router-outlet&gt;</code>の場所に読み込む役割を持ちます。</p>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" width="560" height="342" src="https://it-biz.online/wp-content/uploads/2024/03/image-21.png" alt="Angular router-outlet" class="wp-image-9023" srcset="https://it-biz.online/wp-content/uploads/2024/03/image-21.png 560w, https://it-biz.online/wp-content/uploads/2024/03/image-21-500x305.png 500w, https://it-biz.online/wp-content/uploads/2024/03/image-21-300x183.png 300w" sizes="(max-width: 560px) 100vw, 560px" /><figcaption class="wp-element-caption">図2：Angular router-outlet</figcaption></figure>



<p class="has-text-align-center"><span class="badge-blue">サンプルコード</span>　<strong>router-outlet</strong></p>



<p><code><span class="blue">app-routing.module.ts</span></code>に、2つのコンポーネントへのルートを定義。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { HomeComponent } from './home/home.component';
import { AboutComponent } from './about/about.component';

const routes: Routes = [
  { path: 'home', component: HomeComponent },
  { path: 'about', component: AboutComponent },
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }</pre>



<p><code><span class="blue">app.component.html</span></code>（または任意のテンプレートファイル）に<code><span class="blue">&lt;router-outlet&gt;</span></code>を配置。これにより、ルートに応じてコンポーネントがこの場所に表示されます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;!-- ナビゲーションリンク -->
&lt;nav>
  &lt;ul>
    &lt;li>&lt;a routerLink="/home">Home&lt;/a>&lt;/li>
    &lt;li>&lt;a routerLink="/about">About&lt;/a>&lt;/li>
  &lt;/ul>
&lt;/nav>

&lt;!-- ルートコンポーネントが表示される場所 -->
&lt;router-outlet>&lt;/router-outlet></pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>上記の例では、ブラウザで<code>/home</code>や<code>/about</code>にアクセスすると、<code>&lt;router-outlet&gt;</code>の位置に対応するコンポーネントが表示されるということです。</p>
</div></div>



<p><code>&lt;router-outlet&gt;</code>がAngularアプリケーションにおけるルーティングとビューの管理の中心であることが理解できましたか？実際には、さらに多くのルートや複雑なナビゲーション構造を設定することができますが、基本的な考え方は同じ。</p>



<p><code>&lt;router-outlet&gt;</code>は、Angularでのルーティングシステムにおいて、動的にコンポーネントを表示する場所を指定するディレクティブ。アプリケーションのナビゲーションに従って、指定されたコンポーネントをこの場所に読み込み、表示します。</p>



<h2 class="wp-block-heading"><span id="toc4">ナビゲーションとリンク</span></h2>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>最後にリンクの設定方法を解説します。</p>
</div></div>



<p>ルーティングモジュール（コンポーネントとURLの紐づけ）、ルーターアウトレット（コンポーネントの表示領域）の設定が完了したら、あとは画面上に上記のURLを配置していくだけ。ただし、普通にHTMLの<a href="https://it-biz.online/web-design/link/">aタグ</a>を配置するだけでは不十分です。</p>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">なぜ、aタグでリンクを貼るだけではだめなのでしょうか。</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p>従来の<code>&lt;a&gt;</code>タグを使用してWebページ間でリンクを作成すると、リンク先のページへ移動する際にブラウザは現在のページをアンロードし、<span class="marker-under">新しいページを完全に読み込むため</span>。（＝SPAとしてのメリットが享受できない）</p>
</div></dd></dl></div>



<p>Angularでは、ページ遷移を実現するために、ディレクティブとプログラム的な方法の両方を提供しています。ここでは、両方の方法を使ってナビゲーションを実装する方法について詳しく見ていきましょう。</p>



<h3 class="wp-block-heading"><span id="toc5">ナビゲーションリンク（routerLinkディレクティブ）</span></h3>



<p>Angularでは、テンプレート内で<code><span class="blue">&lt;a&gt;</span></code>タグに<code><span class="blue">routerLink</span></code>ディレクティブを使用して、ナビゲーションリンクを簡単に作成することができます。<code>routerLink</code>は、<strong><span class="marker-under">ユーザーがリンクをクリックしたときに遷移するパスを指定</span></strong>します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;nav>
  &lt;ul>
    &lt;li>&lt;a routerLink="/home">Home&lt;/a>&lt;/li>
    &lt;li>&lt;a routerLink="/about">About&lt;/a>&lt;/li>
  &lt;/ul>
&lt;/nav></pre>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/web-design/nav/">navタグ</a> / <a href="https://it-biz.online/web-design/list/">リストタグ</a></p>



<p>このサンプルコードでは、ホームページ(<code>/home</code>)と詳細ページ(<code>/about</code>)へのリンクを含むナビゲーションバーを作成しています。ユーザーがこれらのリンクのいずれかをクリックすると、指定されたパスに対応するコンポーネントを<code>&lt;router-outlet&gt;</code>に表示します。</p>



<h3 class="wp-block-heading"><span id="toc6">プログラムによるナビゲーション（Routerサービス）</span></h3>



<p>Angularでは、<code><span class="blue">Router</span></code>サービスをインジェクトしてプログラムによるナビゲーションを実装することもできます。これは、ユーザーがフォームを送信した後や、特定のイベントが発生したときなど、コード内から直接ページ遷移をトリガーする場合に便利です。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>ちょっと難しいですが、実際のコードを見てみましょう。コンポーネントクラス内で<code>Router</code>サービスを使う方法は以下の通り。</p>
</div></div>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import { Component } from '@angular/core';
import { Router } from '@angular/router';

@Component({
  selector: 'app-example',
  templateUrl: './example.component.html',
})
export class ExampleComponent {
  constructor(private router: Router) {}

  navigateToHome() {
    this.router.navigate(['/home']);
  }
}</pre>



<p>そして、テンプレート内で、このメソッドをイベント（例えば、ボタンクリック）にバインドします。↓の例では、<code><span class="blue">navigateToHome</span></code>メソッドがボタンクリックイベントにバインドされているので、このメソッドが実行されると、アプリケーションは<code>/home</code>パスに遷移させます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;button (click)="navigateToHome()">Go to Home&lt;/button></pre>



<p>最後にAngularにおけるルーティングの基本知識を表形式で整理します。自分の理解が十分であるかどうか？チェックしておきましょう。</p>



<figure class="wp-block-table"><div class="scrollable-table stfc-sticky"><table><thead><tr><th>項目</th><th>説明</th></tr></thead><tbody><tr><td><strong>ルーティングとは</strong></td><td>URLとコンポーネントをマッピングし、アプリケーション内のナビゲーションを管理する仕組み。</td></tr><tr><td><strong>RouterModule</strong></td><td>Angularのルーティングを管理するためのモジュール。<code>@angular/router</code>からインポートする。</td></tr><tr><td><strong>Routes</strong></td><td>アプリケーション内の各ルート（パスとコンポーネントのマッピング）を定義する配列。</td></tr><tr><td><strong>routerLink</strong></td><td>テンプレート内でリンクを作成し、ユーザーが異なるコンポーネント間をナビゲートできるようにするディレクティブ。</td></tr><tr><td><strong>&lt;router-outlet&gt;</strong></td><td>ルートに応じてコンポーネントが表示される場所をテンプレート内に指定するディレクティブ。</td></tr><tr><td><strong>Router</strong></td><td>プログラムによるナビゲーションを実行するためのサービス。コンポーネント内で<code>navigate</code>や<code>navigateByUrl</code>メソッドを使用。</td></tr></tbody></table></div></figure>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Angular：モジュール@NgModuleの基本を１からわかりやすく</title>
		<link>https://it-biz.online/web-design/ngmodule/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Mon, 11 Mar 2024 09:47:12 +0000</pubDate>
				<category><![CDATA[TypeScript]]></category>
		<category><![CDATA[WEBデザイン]]></category>
		<category><![CDATA[Angular]]></category>
		<category><![CDATA[Web開発]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=8995</guid>

					<description><![CDATA[@NgModuleはAngularでモジュールを作成する際の宣言文のような役割を果たすデコレータです。@NgModuleを用いることで指定したクラスがモジュールであることを明示的に宣言します。 このページでは、Angul [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><code><span class="bold-blue">@NgModule</span></code>はAngularで<strong><span class="marker-under">モジュールを作成する際の宣言文のような役割を果たすデコレータ</span></strong>です。<code><span class="bold-blue">@NgModule</span></code>を用いることで指定したクラスがモジュールであることを明示的に宣言します。</p>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">モジュールとは？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p>モジュールとは関連するコードの集まりのこと。Angularにおけるモジュールは、<a href="https://it-biz.online/web-design/ng-generate-component/">コンポーネント</a>、サービス、ディレクティブ、パイプなど、アプリケーションを構成する部品をまとめる役割を担います。</p>
</div></dd></dl></div>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// 必要なAngularのコアモジュールをインポート
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';

// アプリケーションが使用するコンポーネントをインポート
import { AppComponent } from './app.component';

@NgModule({
  declarations: [
    AppComponent // アプリケーションのコンポーネントを宣言
  ],
  imports: [
    BrowserModule // ブラウザで動作するアプリケーションに必要なモジュールをインポート
  ],
  providers: [], // サービスプロバイダー
  bootstrap: [AppComponent] // アプリケーションのルートコンポーネントを指定
})
export class AppModule { }</pre>



<p>このページでは、Angular初心者の方向けにそもそもモジュールとは何か？という初歩の初歩から解説し、<code><span class="bold-blue">@NgModule</span></code>の意味と基本的な使い方を１からわかりやすくサンプルコード付きで解説します。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">Angularのモジュールとは？</a><ol><li><a href="#toc2" tabindex="0">モジュールの必要性</a></li></ol></li><li><a href="#toc3" tabindex="0">Angular：@NgModuleデコレータ</a><ol><li><a href="#toc4" tabindex="0">@NgModuleの構文ルール</a></li><li><a href="#toc5" tabindex="0">@NgModuleデコレータのプロパティ</a></li></ol></li><li><a href="#toc6" tabindex="0">モジュールの使用</a><ol><li><a href="#toc7" tabindex="0">ステップ1: 機能モジュールの作成</a></li><li><a href="#toc8" tabindex="0">ステップ2: モジュールの利用</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">Angularのモジュールとは？</span></h2>



<p>Angularのモジュールは、<strong>レゴブロックのセット</strong>のようなものです。</p>



<p>レゴは１つひとつの小さなブロックを組み合わせて様々なものを組み立てていきますよね。たとえば、家を作る時には、窓のブロック、ドアのブロック、屋根のブロックなど、それぞれのパーツを組み合わせることで１つの家を作り上げることができます。<br>レゴブロックに家を組み立てるためのブロックセットがあるように、Webページの一部分を作るために必要な「コンポーネント」や「サービス」などのパーツを１つにまとめたものとして、Angularの<strong>モジュール</strong>が存在します。</p>



<p>例えば、「プロフィールページ」というモジュールがあるとすると、このモジュールには「ユーザーの写真を表示するパーツ」「ユーザーの名前を表示するパーツ」「連絡先を表示するパーツ」などが含まれるかもしれません。これらのパーツを１つにまとめたものが「プロフィールページモジュール」です。</p>



<h3 class="wp-block-heading"><span id="toc2">モジュールの必要性</span></h3>



<p>大きなレゴの城を組み立てるとき、0から100までの全部を一度に組み立てようとすると大変です。（土台から天守閣までの一度に作成しようとすると、作業中に「いまは何をしていたっけ？」というように混乱してしまう・・・）</p>



<p>しかし、城の一部分ごとにセットを分けて、それぞれのセットを別々に組み立ててから、最後に全部をつなげるともっと簡単にできます。まずは、土台を作り、次に1階部分、2階部分として作成し、最後にそれぞれのブロックを連結させて作った方が簡単です。</p>



<p>Angularのモジュールも同じで、Webアプリケーションをいろいろなモジュール（セット）に分けることで、ひとつひとつをシンプルに作っていくことができます。そして、全部のモジュールが完成したら、それをつなげて一つの大きなWebアプリケーションを完成させるようなイメージです。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>このモジュールを作成するために利用するのが<code><span class="bold-blue">@NgModule</span></code>です。</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc3">Angular：@NgModuleデコレータ</span></h2>



<p><code><strong><span class="bold-blue">@NgModule</span></strong></code>はAngularの<strong>デコレータ</strong>の一種で、<strong><span class="marker-under">指定したクラスをAngularモジュールとして識別</span></strong>する役割を担います。モジュールのメタデータをAngularフレームワークに提供するために使用され、モジュールの振る舞いを定義します。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">

<a href="https://it-biz.online/web-design/typescript-decorator/" title="【TypeScript】デコレータ＠とは？1分でわかりやすく解説" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="320" height="180" src="https://it-biz.online/wp-content/uploads/2025/04/image-17-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-biz.online/wp-content/uploads/2025/04/image-17-320x180.png 320w, https://it-biz.online/wp-content/uploads/2025/04/image-17-240x135.png 240w, https://it-biz.online/wp-content/uploads/2025/04/image-17-640x360.png 640w" sizes="(max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【TypeScript】デコレータ＠とは？1分でわかりやすく解説</div><div class="blogcard-snippet internal-blogcard-snippet">Angularのデコレータは、コードをより宣言的で簡潔にし、フレームワークの機能を効果的に活用するための強力なツールです。この記事で紹介した主要なデコレータを理解することで、Angularアプリケーションの開発がよりスムーズに進むはずです。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-biz.online" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-biz.online</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2025.04.23</div></div></div></div></a>
</div></figure>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">モジュールのメタデータとは？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p>メタデータには、モジュールに属するコンポーネント、インポートされる他のモジュール、提供するサービス、アプリケーションの起動時に最初にロードするコンポーネントなどが含まれます。<code>@NgModule</code>を使用することで、アプリケーションの構造をAngularに伝え、依存関係の注入、コンポーネントのスコープ、再利用可能な機能のグループ化などを実現します。</p>
</div></dd></dl></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>ひとまずここでは「<strong>モジュールはいろんな部品をまとめた１つの箱</strong>」のようなイメージを持てればOK。</p>
</div></div>



<p>言葉だけで説明されても、中々イメージは湧かないと思いますので、早速モジュールの作成方法～利用方法までをサンプルコード付きで解説していきます。</p>



<h3 class="wp-block-heading"><span id="toc4">@NgModuleの構文ルール</span></h3>



<p><code>@NgModule</code>デコレータは、クラス定義の直前に配置。デコレータは次のように使用します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">@NgModule({
  // プロパティ: 値
})
export class MyModule {}</pre>



<h3 class="wp-block-heading"><span id="toc5">@NgModuleデコレータのプロパティ</span></h3>



<figure class="wp-block-table"><div class="scrollable-table stfc-sticky"><table><thead><tr><th>プロパティ</th><th>説明</th></tr></thead><tbody><tr><td><code>declarations</code></td><td>モジュール内で使用されるコンポーネント、ディレクティブ、パイプを宣言。<br>これらはモジュール内でのみ参照可能。</td></tr><tr><td><code>imports</code></td><td>現在のモジュールで必要とされる他のモジュールを指定。<br>→インポートされたモジュールのコンポーネント、ディレクティブなどを使用できるようになる。</td></tr><tr><td><code>exports</code></td><td>他のモジュールで使用できるようにするコンポーネント、ディレクティブ、パイプを指定。<br>これらは<code>declarations</code>で宣言されたもののサブセット。</td></tr><tr><td><code>providers</code></td><td>モジュールで使用されるサービスのプロバイダーを指定。→サービスがモジュール内のすべてのコンポーネントで利用可能になります。</td></tr><tr><td><code>bootstrap</code></td><td>アプリケーションの起動時にインスタンス化されるルートコンポーネントを指定。このプロパティは主にルートモジュールで使用される。</td></tr><tr><td><code>schemas</code></td><td>テンプレートで使用されるカスタム要素や属性を許可するために使用。例えば、<code>NO_ERRORS_SCHEMA</code>や<code>CUSTOM_ELEMENTS_SCHEMA</code>があります。</td></tr><tr><td><code>id</code></td><td>モジュールのIDを指定します。これは通常、遅延ロードされるモジュールに使用されます。</td></tr></tbody></table></div></figure>



<p>これらのプロパティを使用して、Angularモジュールを定義し、アプリケーションの構造を整理することができます。</p>



<p class="has-text-align-center"><span class="badge-green">サンプルコード</span>　<strong>Angularモジュールの作成例</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// 必要なAngularのコアモジュールをインポート
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';

// アプリケーションが使用するコンポーネントをインポート
import { AppComponent } from './app.component';

@NgModule({
  declarations: [
    AppComponent // アプリケーションのコンポーネントを宣言
  ],
  imports: [
    BrowserModule // ブラウザで動作するアプリケーションに必要なモジュールをインポート
  ],
  providers: [], // サービスプロバイダー（ここでは空）
  bootstrap: [AppComponent] // アプリケーションのルートコンポーネントを指定
})
export class AppModule { }</pre>



<p><code>AppModule</code>はAngularのルートモジュールとして機能し、アプリケーションで最初にロードされるモジュールです。<code>declarations</code>には、このモジュールが直接使用する<code>AppComponent</code>が含まれています。<code>imports</code>には、アプリケーションがブラウザで動作するために必要な<code>BrowserModule</code>が含まれています。<code>bootstrap</code>には、アプリケーションの起動時に最初にロードされるコンポーネントが指定されています。</p>



<h2 class="wp-block-heading"><span id="toc6">モジュールの使用</span></h2>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>ここからは、具体的な例を用いて実際にモジュールを定義する方法を見ていきましょう。</p>
</div></div>



<p class="has-text-align-center is-style-clip-box has-box-style"><strong>サンプルシナリオ</strong></p>



<p>アプリケーションに「ユーザー管理機能」と「注文管理機能」があるとします。これらの機能をそれぞれ別のモジュールで管理することにしました。<code><span class="bold-blue">UserModule</span></code>と<code><span class="bold-blue">OrderModule</span></code>を作成し、それぞれに関連するコンポーネントやサービスをグループ化します。</p>



<h3 class="wp-block-heading"><span id="toc7">ステップ1: 機能モジュールの作成</span></h3>



<p><code>UserModule</code>には、ユーザー一覧を表示する<code><span class="bold-blue">UserListComponent</span></code>とユーザーの詳細を表示する<code><span class="bold-blue">UserDetailComponent</span></code>を含めます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// src/app/user/user.module.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { UserListComponent } from './user-list.component';
import { UserDetailComponent } from './user-detail.component';

@NgModule({
  declarations: [UserListComponent, UserDetailComponent],
  imports: [CommonModule],
  exports: [UserListComponent] // UserListComponentを外部に公開
})
export class UserModule {}</pre>



<p>同様に、<code><span class="bold-blue">OrderModule</span></code>には注文一覧を表示する<code><span class="bold-blue">OrderListComponent</span></code>を含めます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// src/app/order/order.module.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { OrderListComponent } from './order-list.component';

@NgModule({
  declarations: [OrderListComponent],
  imports: [CommonModule],
  exports: [OrderListComponent] // OrderListComponentを外部に公開
})
export class OrderModule {}</pre>



<h3 class="wp-block-heading"><span id="toc8">ステップ2: モジュールの利用</span></h3>



<p><code>AppModule</code>（ルートモジュール）で<code>UserModule</code>と<code>OrderModule</code>を利用することにします。これにより、アプリケーション全体でユーザー管理と注文管理の機能が使えるようになります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// src/app/app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
import { UserModule } from './user/user.module'; // UserModuleをインポート
import { OrderModule } from './order/order.module'; // OrderModuleをインポート

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    UserModule, // AppModuleにUserModuleを追加
    OrderModule // AppModuleにOrderModuleを追加
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }</pre>



<p>このように、<strong>Angularモジュールは「呼び出し」されるものではなく</strong>、アプリケーションの構造を定義し、コードを機能単位で整理するために「利用」されます。ルートモジュール（<code>AppModule</code>）または他の機能モジュール内でモジュールをインポートすることにより、そのモジュールが提供する機能（コンポーネント、サービスなど）をアプリケーションの他の部分で使用できるようになります。</p>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<p class="has-text-align-center"><span class="badge-green">まとめ</span>　<strong>モジュールとは？</strong></p>



<ul class="wp-block-list">
<li>アプリケーションの一部を機能ごとにまとめたコードの集合体。</li>



<li>コンポーネント、サービス、ディレクティブ、パイプなどをグループ化し、機能単位で管理する。</li>



<li>アプリケーションの構造を整理し、コードの再利用性とメンテナンス性を向上させる。</li>
</ul>



<p class="has-text-align-center"><span class="badge-green">まとめ</span>　<strong><code>@NgModule</code>とは？</strong></p>



<ul class="wp-block-list">
<li>Angularのデコレーターで、クラスをAngularモジュールとして識別する。</li>



<li>モジュールのメタデータを定義し、コンポーネントのスコープや依存関係の注入を管理する。</li>



<li>アプリケーションの起動時に最初にロードするコンポーネント（bootstrap）、他のモジュールから利用可能にするエクスポート（exports）など、モジュールの振る舞いをAngularに伝える。</li>
</ul>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Angular：パイプとは？初心者向けにわかりやすく３分で解説</title>
		<link>https://it-biz.online/web-design/angular-pipe/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Fri, 17 Jan 2025 15:57:42 +0000</pubDate>
				<category><![CDATA[TypeScript]]></category>
		<category><![CDATA[WEBデザイン]]></category>
		<category><![CDATA[Angular]]></category>
		<category><![CDATA[Web開発]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=9585</guid>

					<description><![CDATA[パイプ (Pipe) とは何か？ Angularにおけるパイプ (Pipe) は、テンプレート内で表示するデータを「見た目」や「形式」の観点から変換・加工する仕組みです。このページでは、初心者向けのイメージと、仕組みの本 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>パイプ (Pipe) とは何か？</p>



<p>Angularにおけるパイプ (Pipe) は、テンプレート内で表示するデータを「見た目」や「形式」の観点から変換・加工する仕組みです。このページでは、初心者向けのイメージと、仕組みの本質的な部分を段階的に解説していきます。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-6" checked><label class="toc-title" for="toc-checkbox-6">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">パイプ (Pipe) とは何か？</a><ol><li><a href="#toc2" tabindex="0">パイプの目的・役割</a></li><li><a href="#toc3" tabindex="0">パイプを使うには</a></li></ol></li><li><a href="#toc4" tabindex="0">初心者がつかむべき「イメージ」と簡単な利用シーン</a><ol><li><a href="#toc5" tabindex="0">単純なビルトインパイプの利用例</a></li><li><a href="#toc6" tabindex="0">複数パイプの連続利用</a></li></ol></li><li><a href="#toc7" tabindex="0">カスタムパイプの基本と概念</a><ol><li><a href="#toc8" tabindex="0">カスタムパイプの最小構成</a></li></ol></li><li><a href="#toc9" tabindex="0">Change Detection (変更検知) との関係</a><ol><li><a href="#toc10" tabindex="0">(1) Angular における変更検知</a></li><li><a href="#toc11" tabindex="0">(2) 純粋パイプと非純粋パイプ</a></li></ol></li><li><a href="#toc12" tabindex="0">具体的な利用シーンとコード例</a><ol><li><a href="#toc13" tabindex="0">シーン1: ユーザー一覧の表示をフィルタ/ソートしたい</a></li><li><a href="#toc14" tabindex="0">シーン2: 日付の差分を表示したい (たとえば「xx日前」「xx時間前」)</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">パイプ (Pipe) とは何か？</span></h2>



<h3 class="wp-block-heading"><span id="toc2">パイプの目的・役割</span></h3>



<ol class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li class="is-style-bottom-margin-2em has-bottom-margin"><strong><span class="marker-under">データ変換 (Formatting / Transforming)</span></strong><br>テンプレート (HTML) に表示する「直前」で、<a href="https://it-biz.online/web-design/ng-generate-component/">コンポーネント</a>から受け取った生データを、ユーザーが見やすい・使いやすい形に整形する。<br>例）日付の表示形式、数値の3桁区切り、文字列の大文字化など。</li>



<li><strong><span class="marker-under">テンプレートの可読性向上</span></strong><br>もしパイプがない場合、コンポーネントやテンプレート内にフォーマット用の複雑な処理が散らばるおそれがある。パイプを使うことで、
<ul class="wp-block-list">
<li>ビジネスロジック (コンポーネント) と表示用のフォーマット処理 (ビュー) を分離しやすい</li>



<li class="is-style-bottom-margin-2em has-bottom-margin">テンプレートは「必要な変換をパイプでつなぐ」だけになる<br>ため可読性が向上する。</li>
</ul>
</li>



<li><strong><span class="marker-under">Angular が提供するビルトイン機能との連携</span></strong><br>代表的なビルトインパイプ (<code>DatePipe</code>, <code>NumberPipe</code>, <code>CurrencyPipe</code>, <code>PercentPipe</code>, <code>UpperCasePipe</code> など) を利用することで、面倒なデータ変換の多くを少ないコードで実現できる。</li>
</ol>



<h3 class="wp-block-heading"><span id="toc3">パイプを使うには</span></h3>



<ul class="wp-block-list">
<li><strong>“|” (パイプ記号) を使う</strong><br>テンプレート内で <code>{{ 変数 | pipe名 }}</code> のように使います。複数のパイプをつなげて使うこともできます。</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;!-- 例: 価格を3桁区切りにフォーマットし、通貨も付けて表示する -->
{{ price | number:'1.0-0' | currency:'JPY' }}
</pre>



<h2 class="wp-block-heading"><span id="toc4">初心者がつかむべき「イメージ」と簡単な利用シーン</span></h2>



<h3 class="wp-block-heading"><span id="toc5">単純なビルトインパイプの利用例</span></h3>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;!-- コンポーネントのプロパティ -->
export class ExampleComponent {
  today = new Date();  // たとえば 2025-01-18
  price = 1234.5;
  userName = 'angular user';
}
</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;!-- テンプレート -->
&lt;!-- ① 日付を表示 -->
&lt;p>Today: {{ today | date:'yyyy/MM/dd' }}&lt;/p>
&lt;!-- 出力例: Today: 2025/01/18 -->

&lt;!-- ② 価格を3桁区切りにして、通貨表記に -->
&lt;p>Price: {{ price | currency:'USD':'symbol':'1.0-2' }}&lt;/p>
&lt;!-- 出力例: Price: $1,234.50 -->

&lt;!-- ③ 文字列をすべて大文字に -->
&lt;p>User: {{ userName | uppercase }}&lt;/p>
&lt;!-- 出力例: User: ANGULAR USER -->
</pre>



<ul class="wp-block-list">
<li>このように、<code>{{ 変数 | pipe名:オプション }}</code> の形で、テンプレート上で値を変換するのがパイプの基本的な使い方です。</li>



<li><strong>利用シーン</strong>: ユーザーに見せたい情報があるとき、コンポーネント側のデータ構造や型はそのままで、最後の「表示」のタイミングだけパイプでスッキリ変換できる。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc6">複数パイプの連続利用</span></h3>



<p>1つの値に対して、パイプ記号 <code>|</code> を複数つなげることも可能です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;!-- 価格を3桁区切り→JPY表記→大文字に -->
&lt;p>{{ price | number:'1.0-0' | currency:'JPY':'symbol' | uppercase }}&lt;/p>
</pre>



<ul class="wp-block-list">
<li><code>price</code> を整数表記にして (<code>number:'1.0-0'</code>)、</li>



<li><code>currency</code> で通貨（￥）を付与し (<code>currency:'JPY'</code>)、</li>



<li><code>uppercase</code> で最終的に大文字化したものが表示される。</li>
</ul>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>データ変換が段階的に行われるため、一連のフォーマット処理をテンプレート上で可視化しやすいのが利点の１つです。</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc7">カスタムパイプの基本と概念</span></h2>



<p>Angularで用意されているビルドインパイプでは要件を満たさない場合、自分でパイプを作成することもできます。</p>



<p>例）日付 +「何日前」「何時間前」といった表示形式にしたい、配列を特定の条件でフィルタリングしたい、など。</p>



<h3 class="wp-block-heading"><span id="toc8">カスタムパイプの最小構成</span></h3>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// ex-rate.pipe.ts
import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'exRate' // テンプレート上で使うパイプ名
})
export class ExRatePipe implements PipeTransform {
  // transformメソッドが肝。引数は自由に定義できる（最初が「値」、それ以降がパラメータ）
  transform(value: number, rate: number): number {
    return value * rate;
  }
}
</pre>



<ol class="wp-block-list">
<li><code>@Pipe()</code> デコレーターで、パイプであることとパイプ名を宣言。</li>



<li><code>PipeTransform</code> インターフェースの <code>transform</code> メソッドを実装する（必須）。</li>



<li>変換したい処理を <code>transform</code> で書き、戻り値を返す。</li>
</ol>



<p><strong>テンプレートでの使用例</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;!-- コンポーネントで amount = 100 として、1ドル=135円換算 で表示 -->
&lt;p>JPY: {{ amount | exRate:135 }}&lt;/p>
&lt;!-- 実行結果: 13500 -->
</pre>



<div class="wp-block-cocoon-blocks-tab-box-1 blank-box bb-tab bb-hint block-box">
<p>Angular のパイプ (Pipe) は <code>PipeTransform</code> インターフェースを実装しなければなりません。その必須メソッドが <code>transform</code> です。</p>



<ul class="wp-block-list">
<li><strong>役割</strong>: テンプレートから受け取った「変換元の値」と「パイプに与える引数 (オプション)」を受け取り、データ変換の結果を返却する。</li>



<li><strong>イメージ</strong>: 「生データ → <code>transform</code> → 表示用データ」の流れをになう変換ロジック本体。</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">@Pipe({
  name: 'exRate'
})
export class ExRatePipe implements PipeTransform {
  transform(value: number, rate: number): number {
    return value * rate;
  }
}
</pre>



<p>上記の例では <code>transform(value, rate)</code> という形で「入力値とパラメータを受け取り、掛け算した結果」を返しています。テンプレートで <code>{{ amount | exRate:135 }}</code> と書くと、</p>



<ol class="wp-block-list">
<li><code>amount</code> が <code>value</code> に相当</li>



<li><code>135</code> が <code>rate</code> に相当</li>



<li><code>transform(100, 135)</code> → <code>13500</code> が戻り値<br>…という流れで表示に反映されます。</li>
</ol>
</div>



<h2 class="wp-block-heading"><span id="toc9">Change Detection (変更検知) との関係</span></h2>



<h3 class="wp-block-heading"><span id="toc10">(1) Angular における変更検知</span></h3>



<ul class="wp-block-list">
<li>Angular はコンポーネントのプロパティが変わったかどうかを監視 (Change Detection) し、変更があればテンプレートを再描画 (再評価) する仕組み。</li>



<li><strong>純粋パイプ (Pure Pipe)</strong> は「入力値 (およびその参照) が変わったときのみ」<code>transform</code> を再実行する。</li>



<li><strong>非純粋パイプ (Impure Pipe)</strong> は「変更検知サイクルごとに」<code>transform</code> を再実行する。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc11">(2) 純粋パイプと非純粋パイプ</span></h3>



<ol class="wp-block-list">
<li><strong>純粋パイプ (Pure Pipe)</strong>
<ul class="wp-block-list">
<li>デフォルトではこちら。<code>@Pipe({ name: 'xxx' })</code> と書くだけで純粋パイプとして扱われる。</li>



<li>値が変わったときだけ再評価されるので、パフォーマンスによい。</li>



<li>単純な日付変換や数値フォーマットなど、入力値が変わらないときに「結果も変わらない」処理に最適。</li>
</ul>
</li>



<li><strong>非純粋パイプ (Impure Pipe)</strong>
<ul class="wp-block-list">
<li><code>@Pipe({ name: 'xxx', pure: false })</code> のように、<code>pure: false</code> を指定すると非純粋パイプになる。</li>



<li>変更検知サイクルのたびに毎回 <code>transform</code> が走るので、配列やオブジェクトの“中身”の変化に対しても都度再評価される。</li>



<li><strong>利用シーン</strong>:
<ul class="wp-block-list">
<li>配列・オブジェクトをテンプレート上でフィルタやソートしたいときに、「単純に参照が新規になった/ならない」を超えて、内容の微細な変化に対応させたい場合など。</li>



<li>ただしパフォーマンスに影響するので、よく検討してから使う。</li>
</ul>
</li>
</ul>
</li>
</ol>



<p><strong>非純粋パイプの簡単な例</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">@Pipe({
  name: 'search',
  pure: false // 非純粋パイプ
})
export class SearchPipe implements PipeTransform {
  transform(items: any[], keyword: string): any[] {
    return items.filter(item => item.name.includes(keyword));
  }
}
</pre>



<p>この例では、<code>items</code> (配列) や <code>keyword</code> (検索文字列) が細かく変化するたびにパイプを再評価し、フィルタ済みの配列を返す。もし純粋パイプだと、配列の「参照」が同じままでは再実行されないため、意図するタイミングで結果が更新されない場合がある。とはいえ「毎回呼ばれる」ことになるため、大きな配列・複雑な処理には注意が必要です。</p>



<h2 class="wp-block-heading"><span id="toc12">具体的な利用シーンとコード例</span></h2>



<h3 class="wp-block-heading"><span id="toc13">シーン1: ユーザー一覧の表示をフィルタ/ソートしたい</span></h3>



<ul class="wp-block-list">
<li>パイプでフィルタ処理を書けば、テンプレートに <code>| filterUser:'xxx'</code> のように書くだけで表示を切り替えられる。</li>



<li>ただし大量データがある場合は、都度全件フィルタするとパフォーマンスが落ちるため、コンポーネント側でフィルタした結果を保持するなど検討が必要。</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">@Pipe({ 
  name: 'filterUser'
})
export class FilterUserPipe implements PipeTransform {
  transform(users: { id: number; name: string; }[], searchTerm: string): any[] {
    if (!searchTerm) return users;
    return users.filter(user => 
      user.name.toLowerCase().includes(searchTerm.toLowerCase())
    );
  }
}
</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;!-- テンプレート -->
&lt;input [(ngModel)]="keyword" placeholder="検索ワード" />
&lt;ul>
  &lt;li *ngFor="let user of users | filterUser:keyword">
    {{ user.name }}
  &lt;/li>
&lt;/ul>
</pre>



<h3 class="wp-block-heading"><span id="toc14">シーン2: 日付の差分を表示したい (たとえば「xx日前」「xx時間前」)</span></h3>



<ul class="wp-block-list">
<li>ビルトインの <code>DatePipe</code> では「相対的な日付表示」はサポートしていない (locale, format によるもの) ので、カスタムパイプで実装する。</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">@Pipe({
  name: 'relativeTime'
})
export class RelativeTimePipe implements PipeTransform {
  transform(value: Date): string {
    const now = new Date();
    const diffMs = now.getTime() - value.getTime();
    const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
    const diffHours = Math.floor(diffMs / (1000 * 60 * 60));

    if (diffDays > 0) {
      return `${diffDays}日前`;
    } else if (diffHours > 0) {
      return `${diffHours}時間前`;
    } else {
      return 'たった今';
    }
  }
}
</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;!-- テンプレート例 -->
&lt;p>投稿時刻: {{ post.createdAt | relativeTime }}&lt;/p>
&lt;!-- 出力例: "1日前" "2時間前" ... -->
</pre>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<p class="has-text-align-center"><span class="badge-green">まとめ</span>　<strong>Angularのパイプ</strong>の理解</p>



<p><strong>パイプは「表示直前のデータ変換器」</strong></p>



<ul class="wp-block-list">
<li>テンプレートの可読性と表示処理の再利用性を高めるためにある。</li>



<li>ビルトインパイプでよく使うフォーマット (日付、数値、文字列など) は大半がカバーできる。</li>
</ul>



<p><strong>カスタムパイプで表示ロジックをカプセル化</strong></p>



<ul class="wp-block-list">
<li>変換ロジックを <code>transform</code> メソッドに閉じ込めることで、複数のテンプレートで同じフォーマットを簡単に使い回しできる。</li>



<li>「ビジネスロジックはコンポーネントやサービス側、表示ロジックはパイプ側」と分けるとシンプルに整理できる。</li>
</ul>



<p><strong>Change Detection と「純粋/非純粋」</strong></p>



<ul class="wp-block-list">
<li>純粋パイプは「入力が変わったときだけ」呼ばれるのでパフォーマンスに優れる。</li>



<li>非純粋パイプは「常に呼ばれる」ため、配列やオブジェクトの中身の変化を捉えたい場合に利用する。ただし多用は避ける。</li>
</ul>



<p><strong>利用シーンを明確に</strong></p>



<ul class="wp-block-list">
<li>大量データを都度フィルタしたり、複雑なロジックをパイプで実行するとパフォーマンスが落ちる。</li>



<li>あくまで「ちょっとした表示形式の変更・整形」を軽量に実装するのがパイプの本来の役割。</li>
</ul>
</div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p><strong>パイプは「コンポーネント → テンプレート」の単方向データフローの、テンプレート直前でのフォーマット処理</strong> としてとらえると理解しやすいです。</p>
</div></div>



<p>前提として「Angularの変更検知の流れ (コンポーネントのプロパティが変わるとテンプレートに反映される)」を押さえておけば、純粋パイプと非純粋パイプの振る舞いも自然と理解できるでしょう。一度使ってみるとその便利さを実感できるので、まずはビルトインパイプの日付フォーマットや数値フォーマットから試し、必要に応じてカスタムパイプでオリジナルの変換処理を実装してみてください。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Angular：ディレクティブとは何か？初心者向けにわかりやすく３分で解説</title>
		<link>https://it-biz.online/web-design/angular-directive/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Fri, 17 Jan 2025 10:19:46 +0000</pubDate>
				<category><![CDATA[TypeScript]]></category>
		<category><![CDATA[WEBデザイン]]></category>
		<category><![CDATA[Angular]]></category>
		<category><![CDATA[Web開発]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=9549</guid>

					<description><![CDATA[Angularでよく耳にする「ディレクティブ」という概念は、一言でいうと「HTML要素に特別な振る舞いや制御を付与するための拡張機能」です。 このページでは、そもそもディレクティブって何？という人向けにディレクティブのイ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Angularでよく耳にする「ディレクティブ」という概念は、一言でいうと「<strong><span class="marker-under">HTML要素に特別な振る舞いや制御を付与するための拡張機能</span></strong>」です。</p>



<p>このページでは、そもそもディレクティブって何？という人向けにディレクティブのイメージ・本質的な理解が進むように１からわかりやすく使い方や注意点を解説していきます。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-8" checked><label class="toc-title" for="toc-checkbox-8">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">まずはディレクティブのイメージをつかむ</a><ol><li><a href="#toc2" tabindex="0">「HTMLに命令を埋め込む」という発想</a></li><li><a href="#toc3" tabindex="0">コンポーネントとの違いをざっくり知る</a></li><li><a href="#toc4" tabindex="0">ディレクティブがもたらすメリット</a></li></ol></li><li><a href="#toc5" tabindex="0">ディレクティブの種類</a><ol><li><a href="#toc6" tabindex="0">1. コンポーネント（Component Directive）</a></li><li><a href="#toc7" tabindex="0">2. 構造ディレクティブ（Structural Directive）</a></li><li><a href="#toc8" tabindex="0">3. 属性ディレクティブ（Attribute Directive）</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">まずはディレクティブのイメージをつかむ</span></h2>



<p>たとえば、普通のHTMLでは<code>&lt;div></code>や<code>&lt;p></code>などの要素をただ書いただけでは、そこに特別な「動き」はありません。テキストを表示したり、見出しを表現したりするだけです。</p>



<p>そこに「<strong>この要素は、ある条件が満たされたら表示し、そうでなければ非表示にしたい</strong>」とか、「<strong>ある配列のデータをもとに、同じ形の要素を繰り返し表示したい</strong>」といった動的な振る舞いを付けたくなる場面が出てきます。</p>



<p>Angularにおいては、この「動的な振る舞い」をHTML要素に追加するための仕組みこそがディレクティブです。ディレクティブを使うと、HTMLタグをただ書くだけでなく、「<strong>この要素はどう表示されるのか</strong>」「<strong>いつレンダリングされるのか</strong>」といった命令を付け加えることができます。</p>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box not-nested-style cocoon-block-tab-caption-box"><div class="tab-caption-box-label block-box-label box-label fab-lightbulb"><span class="tab-caption-box-label-text block-box-label-text box-label-text">JavaScriptでのDOM操作との違い</span></div><div class="tab-caption-box-content block-box-content box-content">
<p>従来のJavaScriptでDOM（<span class="badge">参考</span> <a href="https://it-biz.online/web-design/dom/">DOMとは？</a>）を直接操作する場合には、以下のようなステップが必要でした。</p>



<ol class="wp-block-list">
<li>JavaScriptで<code>document.getElementById()</code>などを使い、特定の要素を取得する。</li>



<li>その要素の<code>style.display</code>を操作して表示／非表示を切り替えたり、クラスを付けたり、テキストを変更したりする。</li>



<li>条件が変わるたびに、この要素のDOM操作をもう一度書く。</li>
</ol>



<p>こうした処理を複数のHTML要素に対して行うと、コード量が増えメンテナンスが煩雑になります。さらに、<strong>「UI側(HTML)の定義」と「JavaScript側(ロジック)の処理」が分散</strong>してしまうため、「どこで何をやっているのか」がわかりにくくなる、という課題が出てきます。</p>



<p>一方で、Angularのディレクティブを使うと、HTMLのテンプレートに「表示するときはこうする」という命令（ディレクティブ）を組み込めるので、UIとロジックの関連が見えやすく、構造を把握しやすいという利点があります。</p>
</div></div>



<h3 class="wp-block-heading"><span id="toc2">「HTMLに命令を埋め込む」という発想</span></h3>



<p>ディレクティブは<strong>HTML側に命令を埋め込む</strong>ようなイメージで考えると理解しやすくなります。「ここにもしデータがあったら繰り返し表示する」「ここの条件がtrueなら、このブロックを描画する」といった振る舞いを、HTMLタグの属性として書けるのです。</p>



<ul class="wp-block-list">
<li>例: <code><span class="blue">*ngIf="isVisible"</span></code>
<ul class="wp-block-list">
<li><code>isVisible</code>という変数が<code>true</code>のときだけ要素が表示される</li>
</ul>
</li>



<li>例:<span class="bold-red"> </span><code><span class="blue">*ngFor="let item of items"</span></code>
<ul class="wp-block-list">
<li><code>items</code>配列をひとつずつ取り出して要素を繰り返し生成する</li>
</ul>
</li>
</ul>



<p>こうしたディレクティブをHTMLに貼り付けるだけで、Angularはテンプレートを解釈し、内部的にDOMを追加／削除したり、表示／非表示の切り替えを行ってくれます。</p>



<h3 class="wp-block-heading"><span id="toc3">コンポーネントとの違いをざっくり知る</span></h3>



<p>Angularを学び始めると、ディレクティブとほぼ同時に「<a href="https://it-biz.online/web-design/ng-generate-component/">コンポーネント</a>」という言葉を耳にするはずです。コンポーネントも広い意味では「ディレクティブの一種」とされますが、次のような違いがあります。</p>



<ul class="wp-block-list">
<li><strong>コンポーネント</strong>
<ul class="wp-block-list">
<li>HTMLテンプレート、TypeScriptのクラス、CSSスタイルなどをひとまとめにした「画面の部品」</li>



<li><code>&lt;app-○○></code>のような独自タグとして使うことが多い</li>
</ul>
</li>



<li><strong>ディレクティブ（構造・属性ディレクティブなど）</strong>
<ul class="wp-block-list">
<li>画面の見た目そのものではなく、既存のHTML要素の振る舞いだけを拡張する命令書のようなイメージ</li>



<li><code><span class="blue">*ngIf</span></code>や<code><span class="blue">*ngFor</span></code>のような構造ディレクティブ、<code><span class="blue">[ngClass]</span></code>のような属性ディレクティブが代表例</li>
</ul>
</li>
</ul>



<p>このようにコンポーネントとディレクティブは、どちらも「AngularがHTMLをどう解釈して動的に扱うか」を制御していますが、コンポーネントは「<strong>見た目のかたまり</strong>」を構成するのに対し、ディレクティブは「<strong>特定の振る舞いを要素に追加する</strong>」という役割に特化しているというイメージを持つと、両者を使い分けやすくなります。</p>



<h3 class="wp-block-heading"><span id="toc4">ディレクティブがもたらすメリット</span></h3>



<ol class="wp-block-list">
<li><strong>HTMLテンプレートに直接“動き”を宣言できる</strong>
<ul class="wp-block-list">
<li><code>*ngIf</code>や<code>*ngFor</code>を見れば、一目で「ここの要素が条件付き表示／繰り返し表示なんだ」と理解できる。</li>
</ul>
</li>



<li><strong>コードの可読性・メンテナンス性の向上</strong>
<ul class="wp-block-list">
<li>画面遷移や表示切り替えといったロジックを、HTML側と直接リンクさせて書けるため、可読性が上がる。</li>
</ul>
</li>



<li><strong>複雑なDOM操作の削減</strong>
<ul class="wp-block-list">
<li>もしディレクティブがなければ、JavaScriptでDOM操作のAPIを使って要素の追加削除を毎回行う必要があるが、その分の処理をAngular側が肩代わりしてくれる。</li>
</ul>
</li>
</ol>



<p>こうしたメリットから、Angularのディレクティブは<strong>アプリケーションのUIをより動的かつ宣言的に構築できる</strong>重要な機能だと言えます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>このようにディレクティブの本質は「<strong>HTML要素をベースに、より複雑な処理を記述できる拡張機能</strong>」として存在していることにあります。単純なHTMLの延長線として考えられるので、初心者の方でも慣れてくると「ここで<code>*ngIf</code>を使えばいいのか」「繰り返し表示には<code>*ngFor</code>を使うんだな」と自然に使いこなせるようになるでしょう。</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc5">ディレクティブの種類</span></h2>



<p>Angularでは、多彩な動きをHTML要素に追加できるディレクティブですが、大きく分けて3つのカテゴリーに分類されます。ここでは、それぞれの特徴や使い方をイメージしやすいように、順を追って解説していきます。</p>



<h3 class="wp-block-heading"><span id="toc6">1. コンポーネント（Component Directive）</span></h3>



<ul class="wp-block-list is-style-icon-list-check-valid has-list-style">
<li><strong>何をする？</strong>
<ul class="wp-block-list">
<li>画面（UI）を構成する最小単位の部品を定義するためのディレクティブです。</li>



<li>独自のHTMLテンプレート、CSSスタイル、そして振る舞い（TypeScriptクラス）をまとめて管理します。</li>
</ul>
</li>



<li><strong>どんなイメージ？</strong>
<ul class="wp-block-list">
<li>「ボタン」「カード」「ユーザー情報パネル」のように、ひとかたまりのUI要素として切り出したいときに使います。</li>



<li><code>&lt;app-xxx></code> のような独自タグが作られて、テンプレート内で再利用できるようになります。</li>
</ul>
</li>



<li><strong>なぜ便利？</strong>
<ul class="wp-block-list">
<li>テンプレートやロジックが分離されずに一体化して管理できるため、開発・保守がしやすい。</li>



<li>コードの再利用やチーム開発時の分担がやりやすくなる。</li>
</ul>
</li>
</ul>



<h4 class="wp-block-heading">コンポーネントはディレクティブの一種</h4>



<p>技術的には、コンポーネント（<code>@Component</code>）もディレクティブ（<code>@Directive</code>）の拡張版として位置付けられています。ただし、コンポーネントが「UIのひとかたまり」であるのに対して、構造・属性ディレクティブは「UIの見た目や構造を変化させるための命令書」という位置づけです。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>コンポーネントについては別切りで解説ページを作っておりますので以下で詳しく確認してください。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">

<a href="https://it-biz.online/web-design/ng-generate-component/" title="Angular：コンポーネントの基本：作成方法を３分で解説" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-biz.online/wp-content/uploads/2024/03/image-17-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-biz.online/wp-content/uploads/2024/03/image-17-320x180.png 320w, https://it-biz.online/wp-content/uploads/2024/03/image-17-240x135.png 240w, https://it-biz.online/wp-content/uploads/2024/03/image-17-640x360.png 640w" sizes="(max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Angular：コンポーネントの基本：作成方法を３分で解説</div><div class="blogcard-snippet internal-blogcard-snippet">Angularのコンポーネントとは何か、そして簡単なステップで自分のAngularコンポーネントを作成する方法を学びましょう。このガイドでは、コンポーネントの基本概念から、Angular CLIを利用した効率的なコンポーネントの生成、テンプレートとスタイルのカスタマイズ方法までをわかりやすく解説します。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-biz.online" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-biz.online</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2025.01.10</div></div></div></div></a>
</div></figure>
</div></div>



<h3 class="wp-block-heading"><span id="toc7">2. 構造ディレクティブ（Structural Directive）</span></h3>



<ul class="wp-block-list">
<li><strong>何をする？</strong>
<ul class="wp-block-list">
<li>HTMLの要素を「追加・削除」して、<strong>DOM（画面構造）自体を変化させる</strong>ためのディレクティブです。</li>
</ul>
</li>



<li><strong>どんなイメージ？</strong>
<ul class="wp-block-list">
<li>「条件がtrueのときだけ要素を表示したい」「配列の要素を繰り返し表示したい」など、動的に要素を増減する仕組みが必要なときに使います。</li>
</ul>
</li>



<li><strong>なぜ便利？</strong>
<ul class="wp-block-list">
<li>従来ならJavaScriptでDOM操作をして要素を手動で増やしたり削除したりしていた部分を、テンプレートの記述だけで表現できる。</li>



<li>画面ロジックがHTML上で明確にわかるので、可読性も高い。</li>
</ul>
</li>
</ul>



<p><span class="badge-blue">サンプルコード1</span>　<code><strong>*ngIf</strong></code>と*<code><strong>ngFor</strong></code> の併用</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;div *ngIf="items &amp;&amp; items.length > 0">
  &lt;ul>
    &lt;li *ngFor="let item of items">{{ item }}&lt;/li>
  &lt;/ul>
&lt;/div></pre>



<p>要素が存在して、かつ1つ以上アイテムがある場合にのみ、リストを表示する構造を簡潔に表現できます。構造ディレクティブは、<strong><span class="marker-under"><code>*</code>プレフィックス</span></strong>を使用してテンプレート上で適用されます。これにより、Angularはディレクティブの存在する要素をラップする<code>&lt;ng-template></code>を自動的に作成し、その内容の表示を制御することができます。</p>



<p><span class="badge-blue">サンプルコード2</span>　<code><strong>*ngIf</strong></code>を使用して条件に応じて要素を表示/非表示にする</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;!-- 条件が真の場合のみ&lt;p>タグを表示します -->
&lt;p *ngIf="condition">条件が真のときに表示されます&lt;/p></pre>



<p><span class="badge-blue">サンプルコード3</span>　<code>*ngFor</code>ディレクティブを使用して配列の各アイテムに対して要素を繰り返し表示</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;!-- 配列itemsの各アイテムに対して&lt;li>タグを繰り返し表示します -->
&lt;ul>
  &lt;li *ngFor="let item of items">{{ item }}&lt;/li>
&lt;/ul></pre>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box not-nested-style cocoon-block-tab-caption-box"><div class="tab-caption-box-label block-box-label box-label fab-lightbulb"><span class="tab-caption-box-label-text block-box-label-text box-label-text">カスタム構造ディレクティブ</span></div><div class="tab-caption-box-content block-box-content box-content">
<p>カスタム属性ディレクティブとは、開発者が定義する属性ディレクティブの一種。標準の属性ディレクティブ（例えば、<code>ngStyle</code>や<code>ngClass</code>）以外に、アプリケーションの特定の要求に応じた特別なロジックやスタイリングを適用する必要がある場合に、カスタム属性ディレクティブを作成します。</p>



<p class="has-text-align-center"><span class="badge-blue">ポイント</span>　<strong>カスタム属性ディレクティブの作成ステップ</strong></p>



<ol class="wp-block-list">
<li><strong>ディレクティブクラスの作成</strong>
<ul class="wp-block-list">
<li class="is-style-bottom-margin-1em has-bottom-margin">Angular CLIのコマンド<code><span class="bold-blue">ng generate directive my-directive</span></code>を使用するか、手動でディレクティブクラスを作成します。ディレクティブのデコレーター<code><span class="bold-blue">@Directive</span></code>には、セレクターが指定され、このセレクターはディレクティブが適用される属性を識別します。</li>
</ul>
</li>



<li><strong>ロジックの実装</strong>
<ul class="wp-block-list">
<li class="is-style-bottom-margin-1em has-bottom-margin">ディレクティブクラス内に、要素の外見や振る舞いを変更するロジックを実装します。<code>ElementRef</code>を使用してディレクティブが適用されるDOM要素にアクセスし、<code>Renderer2</code>を使って要素のスタイルやプロパティを安全に変更します。</li>
</ul>
</li>



<li><strong>アプリケーションのモジュールにディレクティブを宣言</strong>
<ul class="wp-block-list">
<li>作成したディレクティブをアプリケーションのモジュール（通常は<code>AppModule</code>）の<code>declarations</code>配列に追加します。</li>
</ul>
</li>
</ol>



<p class="has-text-align-center"><span class="badge-blue">サンプル</span>　<strong>highlight.directive.ts</strong> (カスタム属性ディレクティブ)</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import { Directive, ElementRef, HostListener } from '@angular/core';

@Directive({
  selector: '[appHighlight]'
})
export class HighlightDirective {
  constructor(private el: ElementRef) {}

  @HostListener('mouseenter') onMouseEnter() {
    this.highlight('yellow');
  }

  @HostListener('mouseleave') onMouseLeave() {
    this.highlight(null);
  }

  private highlight(color: string | null) {
    this.el.nativeElement.style.backgroundColor = color;
  }
}</pre>



<p class="has-text-align-center"><code>app.component.html</code>で<code>appHighlight</code>ディレクティブを使用する方法</p>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;div appHighlight>This text will be highlighted when hovered over.&lt;/div></pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>カスタム属性ディレクティブを作成することで、アプリケーションの再利用可能なロジックやビジュアルエフェクトを効率的に管理できるようになります。</p>
</div></div>
</div></div>



<h3 class="wp-block-heading"><span id="toc8">3. 属性ディレクティブ（Attribute Directive）</span></h3>



<ul class="wp-block-list">
<li><strong>何をする？</strong>
<ul class="wp-block-list">
<li>既存のHTML要素やコンポーネントに対して、<strong>見た目や振る舞いを変更するための追加機能</strong>を付与するディレクティブです。</li>



<li>“HTMLタグそのものの構造を増減する”のではなく、“そのタグの属性やスタイルなどを動的に操作する”イメージです。</li>
</ul>
</li>



<li><strong>どんなイメージ？</strong>
<ul class="wp-block-list">
<li>「ある条件でクラスを切り替えたい」「スタイルを動的に変更したい」など、要素の属性に関わる部分をAngularの仕組みと連動させたいときに活躍します。</li>
</ul>
</li>



<li><strong>なぜ便利？</strong>
<ul class="wp-block-list">
<li>画面のデザインや動的変化をコード内のロジックと直接リンクできるので、UIの変更がわかりやすい。</li>



<li>Sassなどのスタイル管理とも相性がよく、UIの動的変更を細かく制御できます。</li>
</ul>
</li>
</ul>



<h4 class="wp-block-heading">代表的な属性ディレクティブ</h4>



<ol class="wp-block-list">
<li><strong><code>[ngClass]</code></strong>
<ul class="wp-block-list">
<li>条件に応じてクラスを追加・削除したり、複数のクラスを同時に切り替えたりできる。</li>



<li>例: <code>[ngClass]="{ 'active': isActive, 'error': hasError }"</code></li>
</ul>
</li>



<li><strong><code>[ngStyle]</code></strong>
<ul class="wp-block-list">
<li>スタイルをオブジェクト形式で動的に変更できる。</li>



<li>例: <code>[ngStyle]="{ 'background-color': bgColor }"</code></li>
</ul>
</li>



<li><strong><code>[ngModel]</code></strong>
<ul class="wp-block-list">
<li>フォーム要素（入力欄など）とデータをバインドするために使う。（Template-driven formsで利用）</li>
</ul>
</li>



<li><strong>その他カスタム属性ディレクティブ</strong>
<ul class="wp-block-list">
<li>Angularが用意しているディレクティブ以外にも、自分で作成して要素の見た目や挙動を拡張できます。</li>
</ul>
</li>
</ol>



<p><span class="badge-blue">サンプルコード4</span>　<strong><code>ngClass</code> の使用例</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;button 
  [ngClass]="{ 'btn-primary': isPrimary, 'btn-disabled': isDisabled }">
  ボタン
&lt;/button></pre>



<p><span class="badge-blue">サンプルコード5</span>　<strong><code>ngStyle</code>ディレクティブを使用して要素のスタイルを動的に適用</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;!-- スタイルオブジェクトに基づいて動的にスタイルを適用 -->
&lt;div [ngStyle]="{'font-size': size + 'px'}">テキストサイズを動的に変更&lt;/div></pre>



<p>これらのディレクティブを利用することで、Angularアプリケーション内のHTML要素の外見や振る舞いを柔軟に制御することができます。構造ディレクティブと属性ディレクティブは、それぞれDOMの構造変更と要素のプロパティ/スタイルの変更という異なる目的で使用され、アプリケーションのUIをよりダイナミックにするために重要な役割を果たします。</p>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<p class="has-text-align-center"><span class="badge-green">まとめ</span>　<strong>ディレクティブ</strong></p>



<ul class="wp-block-list">
<li><strong>コンポーネント</strong>：画面の部品（HTMLテンプレートとスタイル、振る舞いのセット）。</li>



<li><strong>構造ディレクティブ</strong>：HTMLの構造を動的に増やしたり減らしたり（<code>*ngIf</code>、<code>*ngFor</code> など）。</li>



<li><strong>属性ディレクティブ</strong>：要素のクラスやスタイルなどを動的に変化させる（<code>[ngClass]</code>、<code>[ngStyle]</code> など）。</li>
</ul>



<p>これら3つの役割をしっかり把握すると、「どのタイミングでどのディレクティブを使うのか」「表示するUIパーツはコンポーネントにまとめる」「要素の表示切り替えやクラスの変更は構造・属性ディレクティブで行う」といった使い分けが自然にできるようになります。結果として、コードの可読性や再利用性が高まり、大きなアプリケーションでも管理しやすいUI構造を作れるようになるでしょう。</p>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Angular：データバインディングの基礎を1からわかりやすく</title>
		<link>https://it-biz.online/web-design/angular-binding/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Mon, 18 Mar 2024 12:00:00 +0000</pubDate>
				<category><![CDATA[TypeScript]]></category>
		<category><![CDATA[WEBデザイン]]></category>
		<category><![CDATA[Angular]]></category>
		<category><![CDATA[Web開発]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=9027</guid>

					<description><![CDATA[Angularのデータバインディングとは、コンポーネントのクラスとテンプレート間（参考コンポーネントの基本）のデータの自動同期のことを指す用語です。データバインディングのおかげで、コンポーネントの状態の変更を即座にビュー [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Angularの<strong><span class="marker-under">データバインディング</span></strong>とは、コンポーネントのクラスとテンプレート間（<span class="badge">参考</span><a href="https://it-biz.online/web-design/ng-generate-component/">コンポーネントの基本</a>）の<strong>データの自動同期</strong>のことを指す用語です。データバインディングのおかげで、コンポーネントの状態の変更を即座にビューに反映し、逆にユーザーのアクションによるビューの変更をコンポーネントに即座に同期することが可能になります。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="568" height="206" src="https://it-biz.online/wp-content/uploads/2024/03/image-23.png" alt="Angular,データバインディング" class="wp-image-9030" srcset="https://it-biz.online/wp-content/uploads/2024/03/image-23.png 568w, https://it-biz.online/wp-content/uploads/2024/03/image-23-500x181.png 500w, https://it-biz.online/wp-content/uploads/2024/03/image-23-300x109.png 300w" sizes="(max-width: 568px) 100vw, 568px" /><figcaption class="wp-element-caption">図1：Angular データバインディング</figcaption></figure>



<p>このページでは、データバインディングの仕組み・動作原理と実際のコーディング方法を１からわかりやすく初心者向けに解説します。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-10" checked><label class="toc-title" for="toc-checkbox-10">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">データバインディングとは？</a></li><li><a href="#toc2" tabindex="0">補間（Interpolation）</a><ol><li><a href="#toc3" tabindex="0">構文ルール：補間</a></li></ol></li><li><a href="#toc4" tabindex="0">プロパティバインディング</a><ol><li><a href="#toc5" tabindex="0">構文ルール：プロパティバインディング</a></li></ol></li><li><a href="#toc6" tabindex="0">イベントバインディング（Event Binding）</a><ol><li><a href="#toc7" tabindex="0">構文ルール：イベントバインディング（Event Binding）</a></li></ol></li><li><a href="#toc8" tabindex="0">双方向データバインディング（Two-way Binding）</a><ol><li><a href="#toc9" tabindex="0">構文ルール：双方向データバインディング（Two-way Binding）</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">データバインディングとは？</span></h2>



<p>データバインディングとは、超ざっくり説明すると「<strong>データの橋渡し</strong>」をするようなのものです。Angularではこの「橋渡し」を通じて、あなたの<span class="marker-under">アプリケーションのデータ（情報）と画面上の表示をリンク</span>します。</p>



<p>アプリケーション内でデータ（例えば、テキストや数値）を変更すると、その変更が自動的に画面上に反映されるたり、逆にユーザーが画面上で何らかのアクション（例えば、フォームに値を入力するなど）を行った時にはそのアクションがアプリケーションのデータに影響を与えたりするのがデータバインディングです。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>もし、データバインディングという仕組みがなかったとすると・・・</p>



<p><strong>1. 手動でデータ同期が必要</strong></p>



<ul class="wp-block-list">
<li>ユーザーインターフェース（UI）の変更を反映するために、コード内で明示的に値を更新しなければなりません。</li>



<li>逆に、データの変更も手動でUIに反映させる必要があり、作業量が増加。</li>
</ul>



<p><strong>2. コードが複雑化する</strong></p>



<ul class="wp-block-list">
<li>双方向のデータ更新を実現するために、多くのイベントリスナーやロジックを実装する必要があります。</li>



<li>結果、コードの保守性や可読性が低下します。</li>
</ul>
</div></div>



<p>データバインディングという仕組みがあることで、画面とアプリケーション、アプリケーションと画面のデータの自動同期が簡単に行える、ということです。これはAngularを利用するメリットの1つでもあります。</p>



<p>データバインディングの動作原理は実際のコードを見ていくことでイメージが付きやすい性質のものでもあるので、ここから具体的な説明に入りつつ、いくつかサンプルコードをお見せしていきます。データバインディングには大きく分けて４つの種類があります。</p>



<figure class="wp-block-table"><div class="scrollable-table stfc-sticky"><table><thead><tr><th>データバインディングの種類</th><th>構文</th><th>説明</th><th>サンプルコード</th></tr></thead><tbody><tr><td>補間（Interpolation）</td><td><code><span class="bold-blue">{{ expression }}</span></code></td><td>コンポーネントのプロパティやメソッドの値をHTMLテンプレートに表示。</td><td><code>&lt;p&gt;{{ name }}&lt;/p&gt;</code></td></tr><tr><td>プロパティバインディング</td><td><code><span class="bold-blue">[property]="expression"</span></code></td><td>コンポーネントのプロパティをHTML要素のプロパティにバインド。</td><td><code>&lt;img [src]="imageUrl"&gt;</code></td></tr><tr><td>イベントバインディング</td><td><code><span class="bold-blue">(event)="handler()"</span></code></td><td>HTML要素のイベント（例えば、クリック）をコンポーネントのメソッドにバインド。</td><td><code>&lt;button (click)="save()"&gt;Save&lt;/button&gt;</code></td></tr><tr><td>双方向データバインディング</td><td><code><span class="bold-blue">[(ngModel)]="property"</span></code></td><td>コンポーネントのプロパティとHTML要素（通常はフォーム要素）のプロパティを双方向にバインド。これにより、データの同期が保たれる。</td><td><code>&lt;input [(ngModel)]="username"&gt;</code></td></tr></tbody></table></div></figure>



<p>１つずつ詳しく説明します。</p>



<h2 class="wp-block-heading"><span id="toc2">補間（Interpolation）</span></h2>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<ul class="wp-block-list">
<li><strong>キラーワード</strong>: <strong>「穴埋めクイズ」</strong></li>



<li><strong>イメージ</strong>: HTML テンプレートの “{{}}” の部分を穴埋め問題のように、変数の中身（値）で埋める</li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>例）HTML 上で <code>{{ userName }}</code> と書くと、<br>変数 <code>userName</code> の値が画面に表示される。</p>
</blockquote>
</div>



<p>補間（Interpolation）は、Angularで最も基本的かつ一般的なデータバインディングの形式です。</p>



<p>補間は、コンポーネントのプロパティやメソッドの値をHTMLテンプレートに結び付けて、コンポーネントのデータを画面（＝ビュー）に表示するために使われます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>手紙を書くようなイメージ。手紙の内容（データ）を変更すると、その手紙を読む人（画面上の表示）が見るメッセージも変わるのと同じです。</p>
</div></div>



<h3 class="wp-block-heading"><span id="toc3">構文ルール：補間</span></h3>



<p>補間の構文はシンプルです。二重中括弧<code><span class="blue">{{ }}</span></code>を使用し、その中に表示したいコンポーネントのプロパティ名やメソッドを記述します。二重中括弧内に記述されたコードは、Angularによって評価されその結果がHTMLテンプレート内の該当位置に文字列として挿入されます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">{{ propertyName }}</pre>



<p>以下は、補間を使用した簡単なAngularコンポーネントの例です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'Hello, Angular!';
}</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;h1>{{ title }}&lt;/h1></pre>



<p>上記のサンプルコードでは<code><span class="blue">AppComponent</span></code>クラスに<code><span class="blue">title</span></code>プロパティが定義されており、プロパティの値が<code><span class="green">'Hello, Angular!'</span></code>となっています。結果、HTMLテンプレート内で<code><span class="bold-blue">{{ title }}</span></code>を使用することで、この<code>title</code>プロパティの値を<a href="https://it-biz.online/web-design/h1-h6/"><code>&lt;h1&gt;</code>タグ</a>内に動的に表示する仕組み。このアプリケーションを実行すると、ブラウザには<code><span class="green">Hello, Angular!</span></code>と表示されます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>もし、プロパティの値が変更されれば、Angularはその変更を検知し、その瞬間画面の表示も変わるという仕組みです。</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc4">プロパティバインディング</span></h2>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<ul class="wp-block-list">
<li><strong>キラーワード</strong>: <strong>「矢印で受け取るHTML属性」</strong></li>



<li><strong>イメージ</strong>: コンポーネント → HTML属性 へ向かう一本矢印。タグの <code>[property]</code> に値を渡すイメージ。</li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>例）<code>&lt;img [src]="imageUrl"&gt;</code> と書けば、<br>変数 <code>imageUrl</code> の中身が <code>&lt;img&gt;</code> の <code>src</code> 属性に代入される。</p>
</blockquote>
</div>



<p>プロパティバインディングは、その名の通り<strong>コンポーネントのプロパティの値をHTML要素のプロパティにバインド</strong>します。</p>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/web-design/attribute/">HTML要素のプロパティ/属性についてわかりやすく３分で解説</a></p>



<h3 class="wp-block-heading"><span id="toc5">構文ルール：プロパティバインディング</span></h3>



<p>プロパティバインディングの構文は、HTML要素のプロパティ名を角括弧<code><span class="blue">[ ]</span></code>で囲み、その中にバインドしたいコンポーネントのプロパティ名を指定する形式です。<code><span class="blue">target</span></code>はHTML要素のプロパティ名、<code><span class="blue">expression</span></code>はバインドしたいコンポーネントのプロパティ名や式です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">[target]="expression"</pre>



<p>以下は、Angularコンポーネントの<code><span class="blue">imageUrl</span></code>プロパティを<code><span class="blue">&lt;img&gt;</span></code>要素の<code><span class="blue">src</span></code>属性にバインドする方法です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import { Component } from '@angular/core';

@Component({
  selector: 'app-image-display',
  templateUrl: './image-display.component.html',
  styleUrls: ['./image-display.component.css']
})
export class ImageDisplayComponent {
  imageUrl = 'https://example.com/image.png';
}</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;img [src]="imageUrl" alt="Description of the image"></pre>



<h2 class="wp-block-heading"><span id="toc6">イベントバインディング（Event Binding）</span></h2>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<ul class="wp-block-list">
<li><strong>キラーワード</strong>: <strong>「クリックで反応する化学反応」</strong></li>



<li><strong>イメージ</strong>: ユーザーのクリックや入力など、何か“きっかけ” (イベント) が起こったらアクションを実行する。化学反応のように、「イベント」 → 「反応 (関数実行)」</li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>例）<code>&lt;button (click)="onClick()"&gt;</code> と書けば、<br>ボタンをクリックしたタイミングで <code>onClick()</code> 関数が走る。</p>
</blockquote>
</div>



<p>イベントバインディングは、HTML要素から発生する<strong>イベント（例えば、クリックやキーボード入力など）をコンポーネントの<span class="marker-under">メソッド</span>にバインド</strong>します。これにより、ユーザーのアクションに基づいてアプリケーションが反応するような仕組みを構築することができます。</p>



<h3 class="wp-block-heading"><span id="toc7">構文ルール：イベントバインディング（Event Binding）</span></h3>



<p>イベントバインディングの構文は、イベント名を括弧<code><span class="blue">()</span></code>で囲み、その中にバインドしたいコンポーネントのメソッド名を指定。イベントの種類に応じて、様々なHTMLイベントを指定することができます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">(target)="expression"</pre>



<p>以下のサンプルコードでは、ボタンクリックイベントをAngularコンポーネントの<code>onClick</code>メソッドにバインドする方法を示しています。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import { Component } from '@angular/core';

@Component({
  selector: 'app-click-me',
  templateUrl: './click-me.component.html',
  styleUrls: ['./click-me.component.css']
})
export class ClickMeComponent {
  message = '';

  onClick() {
    this.message = 'Button was clicked!';
  }
}</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;button (click)="onClick()">Click me&lt;/button>
&lt;p>{{ message }}&lt;/p></pre>



<p>この例では、<code><span class="blue">&lt;button&gt;</span></code>要素の<code><span class="blue">click</span></code>イベントが<code><span class="blue">onClick</span></code>メソッドにバインドされています。その結果ユーザーがボタンをクリックすると、<code><span class="blue">onClick</span></code>メソッドが実行され、<code>message</code>プロパティの値が更新されるという例。この新しい値は補間を通じて<a href="https://it-biz.online/web-design/paragraph/"><code>&lt;p&gt;</code>要素</a>内に表示され、結果として「Button was clicked!」というメッセージがユーザーに表示されます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>誰かがドアベルを押した時に鳴るチャイムみたいなイメージ。ドアベル（画面上のアクション）が押されると、チャイム（アプリケーションの反応や処理）が鳴るような感じです。</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc8">双方向データバインディング（Two-way Binding）</span></h2>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<ul class="wp-block-list">
<li><strong>キラーワード</strong>: <strong>「恋人同士のように双方向でやりとり」</strong></li>



<li><strong>イメージ</strong>: 片方に変化があるともう片方も自動的に変わる、という双方向の関係。Angular では <code>[(ngModel)]</code> を使って、テンプレートとデータをシームレスにやりとりできる。</li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>例）<code>&lt;input [(ngModel)]="userName"&gt;</code> と書けば、<br>入力欄に文字を入力すると変数 <code>userName</code> が更新され、<br>変数が変わると入力欄も同期して変わる。</p>
</blockquote>
</div>



<p><strong>双方向データバインディング</strong>は、コンポーネントのモデルとHTML要素のビューの間でデータを自動的に同期させる方法を指します。要は、ユーザーの入力が直接モデルを更新し、モデルの変更が直接画面上にリアルタイムで反映されるということ。</p>



<h3 class="wp-block-heading"><span id="toc9">構文ルール：双方向データバインディング（Two-way Binding）</span></h3>



<p>双方向データバインディングのためには、<code><span class="blue">[(ngModel)]</span></code>ディレクティブを使用します。<code><span class="blue">property</span></code>はコンポーネントのプロパティ名。<code><span class="blue">ngModel</span></code>はフォーム要素に最も一般的に使用され、例えばテキストフィールド、ラジオボタン、セレクトボックスなどの値をコンポーネントのプロパティにバインドするのに使われます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">[(ngModel)]="property"</pre>



<p>以下のサンプルは、テキストフィールドの値をコンポーネントの<code>name</code>プロパティと双方向にバインドする方法です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import { Component } from '@angular/core';

@Component({
  selector: 'app-name-editor',
  templateUrl: './name-editor.component.html',
  styleUrls: ['./name-editor.component.css']
})
export class NameEditorComponent {
  name = '';
}</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;input [(ngModel)]="name" placeholder="Enter name">
&lt;p>Hello {{ name }}!&lt;/p></pre>



<p>この例では、<a href="https://it-biz.online/web-design/form/"><code>&lt;input&gt;</code>要素</a>の<code><span class="blue">value</span></code>プロパティと<code><span class="blue">NameEditorComponent</span></code>コンポーネントの<code><span class="blue">name</span></code>プロパティが<code><span class="blue">[(ngModel)]</span></code>を使って双方向にバインドされています。結果、<strong>ユーザーがテキストフィールドに名前を入力すると、その入力がリアルタイムで<code>&lt;p&gt;</code>要素に反映されます。</strong>また、<strong>プログラムによって<code>name</code>プロパティの値が変更されると、その新しい値がテキストフィールドにも表示されます。</strong></p>



<figure class="wp-block-table"><div class="scrollable-table stfc-sticky"><table><thead><tr><th>データバインディングの種類</th><th>構文</th><th>説明</th><th>サンプルコード</th></tr></thead><tbody><tr><td>補間（Interpolation）</td><td><code><span class="bold-blue">{{ expression }}</span></code></td><td>コンポーネントのプロパティやメソッドの値をHTMLテンプレートに表示。</td><td><code>&lt;p&gt;{{ name }}&lt;/p&gt;</code></td></tr><tr><td>プロパティバインディング</td><td><code><span class="bold-blue">[property]="expression"</span></code></td><td>コンポーネントのプロパティをHTML要素のプロパティにバインド。</td><td><code>&lt;img [src]="imageUrl"&gt;</code></td></tr><tr><td>イベントバインディング</td><td><code><span class="bold-blue">(event)="handler()"</span></code></td><td>HTML要素のイベント（例えば、クリック）をコンポーネントのメソッドにバインド。</td><td><code>&lt;button (click)="save()"&gt;Save&lt;/button&gt;</code></td></tr><tr><td>双方向データバインディング</td><td><code><span class="bold-blue">[(ngModel)]="property"</span></code></td><td>コンポーネントのプロパティとHTML要素（通常はフォーム要素）のプロパティを双方向にバインド。これにより、データの同期が保たれる。</td><td><code>&lt;input [(ngModel)]="username"&gt;</code></td></tr></tbody></table></div></figure>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>ngOnInitとは？Angularのライフサイクルを1からわかりやすく</title>
		<link>https://it-biz.online/web-design/lifesycle/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Fri, 10 Jan 2025 10:06:24 +0000</pubDate>
				<category><![CDATA[TypeScript]]></category>
		<category><![CDATA[WEBデザイン]]></category>
		<category><![CDATA[Angular]]></category>
		<category><![CDATA[Web開発]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=9554</guid>

					<description><![CDATA[Angularのライフサイクルは、コンポーネントやディレクティブが「生成」「変化」「破棄」という流れで動作する仕組みを指します。ngOnInitはこのライフサイクルの中で、初期化のために特化したフックです。 目次 Ang [&#8230;]]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box information-box">
<p>結論「<code><strong>ngOnInit</strong></code>は、Angularのライフサイクルフックの１つで、コンポーネントが初期化された直後に呼び出されます。主に、初期化処理やデータの準備を行うために使用されます。」</p>
</div>



<p>Angularのライフサイクルは、コンポーネントやディレクティブが「生成」「変化」「破棄」という流れで動作する仕組みを指します。<strong><code>ngOnInit</code>はこのライフサイクルの中で、初期化のために特化したフック</strong>です。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p><strong><code>ngOnInit</code></strong>を理解するために、このページではAngularのライフサイクル/ライフサイクルフックの概念について解説します。</p>
</div></div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-12" checked><label class="toc-title" for="toc-checkbox-12">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">Angularのライフサイクルとは？</a></li><li><a href="#toc2" tabindex="0">ライフサイクルフックとは？</a><ol><li><a href="#toc3" tabindex="0">Angularの主要フック</a></li><li><a href="#toc4" tabindex="0">ngOnInitの役割と特徴</a></li></ol></li><li><a href="#toc5" tabindex="0">ngOnInitを通じてライフサイクルを理解する</a><ol><li><a href="#toc6" tabindex="0">動作の原理</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">Angularのライフサイクルとは？</span></h2>



<p>Angularのコンポーネントは以下のような「一生」を持っています：</p>



<ol class="wp-block-list">
<li><strong>生成 (Creation)</strong><br>コンポーネントが作られる瞬間。</li>



<li><strong>変化 (Change Detection)</strong><br>データが更新され、それに応じてビューが再描画される過程。</li>



<li><strong>破棄 (Destruction)</strong><br>役割を終えて、メモリから削除されるタイミング。</li>
</ol>



<p>この一連の流れが「ライフサイクル」です。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>よりシステム的に言えば、対象のコードがロードされ、そのコードが外部からのリクエストで様々な動作をし、最終的に処理が終了する～、という一連の流れをライフサイクルと呼びます。</p>
</div></div>



<p>日常生活の例で考えてみると以下のようなイメージです。</p>



<ul class="wp-block-list is-style-numeric-list-step has-list-style">
<li><strong>生成</strong>: 新しい家を建てる。</li>



<li><strong>変化</strong>: 家具を配置し直したり、壁を塗り替える。</li>



<li><strong>破棄</strong>: 家を解体する。</li>
</ul>



<h2 class="wp-block-heading"><span id="toc2">ライフサイクルフックとは？</span></h2>



<p>ライフサイクルフックは、ライフサイクルの特定のタイミングで実行される<strong><span class="marker-under">「きっかけ」や「スイッチ」</span></strong>のようなものです。開発者がこれを利用して、適切なタイミングでカスタムロジックを追加することができます。</p>



<p>これをシステム的に捉えると、ライフサイクルフックは「状態遷移」に基づくイベント駆動型プログラミングの一部と説明できます。アプリケーションやコンポーネントは、それぞれの状態（生成、更新、破棄など）において異なる責務を持ち、ライフサイクルフックはその責務を実行するトリガーとして機能します。</p>



<h3 class="wp-block-heading"><span id="toc3">Angularの主要フック</span></h3>



<figure class="wp-block-table"><div class="scrollable-table stfc-sticky"><table class="has-fixed-layout"><thead><tr><th>タイミング</th><th>フック名</th><th>主な用途</th></tr></thead><tbody><tr><td><strong>生成時</strong></td><td><code>constructor</code></td><td>コンポーネントのインスタンス化。依存性の注入。</td></tr><tr><td><strong>初期化時</strong></td><td><code>ngOnInit</code></td><td>初期設定や外部データの取得を実行。</td></tr><tr><td><strong>変更検知時</strong></td><td><code>ngOnChanges</code>、<code>ngDoCheck</code></td><td>入力データの変更を検知。</td></tr><tr><td><strong>描画後</strong></td><td><code>ngAfterViewInit</code></td><td>DOM要素や子コンポーネントが完全に初期化された後の処理。</td></tr><tr><td><strong>破棄時</strong></td><td><code>ngOnDestroy</code></td><td>メモリ解放やサブスクリプション解除。</td></tr></tbody></table></div></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc4">ngOnInitの役割と特徴</span></h3>



<p><code>ngOnInit</code>は、Angularがすべての入力プロパティ（<code>@Input</code>）を設定した後、1度だけ呼び出されます。<strong>生成フェーズの一部として、コンポーネントの初期化処理を担当</strong>します。</p>



<h4 class="wp-block-heading"><strong>特徴</strong></h4>



<ul class="wp-block-list">
<li><strong>呼び出し回数</strong>: 一度だけ呼び出される。</li>



<li><strong>依存性注入後に実行</strong>: コンストラクタで設定された依存性を利用可能。</li>



<li><strong>データが利用可能</strong>: 入力プロパティ（<code>@Input</code>）が初期化された状態。</li>
</ul>



<h4 class="wp-block-heading">用途</h4>



<ol class="wp-block-list">
<li><strong>初期データの設定</strong>
<ul class="wp-block-list">
<li>APIからのデータ取得。</li>



<li>初期状態を設定する。</li>
</ul>
</li>



<li><strong>入力データの利用</strong>
<ul class="wp-block-list">
<li><code>@Input</code>で渡された値を基にロジックを実行。</li>
</ul>
</li>



<li><strong>コンストラクタとの分離</strong>
<ul class="wp-block-list">
<li>初期化ロジックをコンストラクタから分離し、コードを整理する。</li>
</ul>
</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc5">ngOnInitを通じてライフサイクルを理解する</span></h2>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>ここからは具体的にどんな感じで動作するのか？をイメージできるように実際のコードを用いてご説明します。</p>
</div></div>



<p>以下のコードで<code>ngOnInit</code>がライフサイクル全体の中でどのように機能するかを見てみましょう。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import { Component, OnInit, Input } from '@angular/core';

@Component({
  selector: 'app-demo',
  template: `&lt;p>{{message}}&lt;/p>`
})
export class DemoComponent implements OnInit {
  @Input() userName: string = ''; // 入力プロパティ
  message: string = '';

  constructor() {
    console.log('Constructor: コンポーネントが生成されました');
  }

  ngOnInit() {
    console.log('ngOnInit: 初期化処理を実行します');
    this.message = `こんにちは、${this.userName}さん！`;
  }
}
</pre>



<p>このコードは、Angularのコンポーネントを使って、ユーザー名を受け取り、その名前を使ってメッセージを表示する仕組みを実現しています。以下に、実行結果と動作の原理をわかりやすく説明します。</p>



<p class="is-style-border-left-box has-box-style"><strong>実行結果</strong></p>



<p>このコンポーネントを以下のように使用すると、画面に「こんにちは、〇〇さん！」と表示されます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;app-demo [userName]="'太郎'">&lt;/app-demo>
</pre>



<p>画面の表示：</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">こんにちは、太郎さん！
</pre>



<h3 class="wp-block-heading"><span id="toc6">動作の原理</span></h3>



<ol class="wp-block-list">
<li><strong>コンポーネントの基本構成</strong>
<ul class="wp-block-list">
<li><code>@Component</code> デコレーターでコンポーネントの情報を設定します。</li>



<li><code>selector: 'app-demo'</code> により、このコンポーネントは <code>&lt;app-demo></code> というタグで使用可能になります。</li>



<li><code>template: &lt;p>{{message}}&lt;/p></code> で、HTMLテンプレートに表示する内容を指定しています。</li>
</ul>
</li>



<li><strong>入力プロパティ (<code>@Input</code>)</strong>
<ul class="wp-block-list">
<li><code>@Input()</code> デコレーターを使うと、親コンポーネントから値を受け取ることができます。</li>



<li>この例では、<code>userName</code> プロパティが入力プロパティで、親コンポーネントから値が渡されます。</li>
</ul>
</li>



<li><strong>コンストラクター</strong>
<ul class="wp-block-list">
<li><code>constructor()</code> は、コンポーネントが生成されたタイミングで一度だけ呼び出されます。</li>



<li>ここでは特別な処理はしていませんが、ログ出力で確認できます。</li>
</ul>
</li>



<li><strong><span class="marker-under">ngOnInit メソッド</span></strong>
<ul class="wp-block-list">
<li><code>ngOnInit()</code> は、コンポーネントが初期化された後に呼び出されます。</li>



<li>このメソッドで、<code>userName</code> を使って <code>message</code> の内容を設定しています。</li>
</ul>
</li>



<li><strong>動作の流れ</strong>
<ul class="wp-block-list">
<li>親コンポーネントから <code>&lt;app-demo [userName]="'太郎'">&lt;/app-demo></code> として <code>userName</code> に値が渡されます。</li>



<li><code>ngOnInit()</code> が実行され、<code>message</code> プロパティに「こんにちは、太郎さん！」という文字列がセットされます。</li>



<li>テンプレートの <code>&lt;p>{{message}}&lt;/p></code> がその値を表示します。</li>
</ul>
</li>
</ol>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Angular：コンポーネントの基本：作成方法を３分で解説</title>
		<link>https://it-biz.online/web-design/ng-generate-component/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Wed, 13 Mar 2024 12:00:00 +0000</pubDate>
				<category><![CDATA[TypeScript]]></category>
		<category><![CDATA[WEBデザイン]]></category>
		<category><![CDATA[Angular]]></category>
		<category><![CDATA[Web開発]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=9006</guid>

					<description><![CDATA[このページでは、Angular初心者向けにコンポーネントの基本とコンポーネントの作成方法、およびコンポーネントの利用方法を１からわかりやすく解説します。 目次 Angularのコンポーネントとは？ステップ1: コンポーネ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>このページでは、Angular初心者向けにコンポーネントの基本とコンポーネントの作成方法、およびコンポーネントの利用方法を１からわかりやすく解説します。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p><a href="https://it-biz.online/web-design/what-is-angular/">Angularとは何か？</a>を概要レベルで理解していることを前提に解説します。</p>
</div></div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-14" checked><label class="toc-title" for="toc-checkbox-14">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">Angularのコンポーネントとは？</a></li><li><a href="#toc2" tabindex="0">ステップ1: コンポーネントの生成</a></li><li><a href="#toc3" tabindex="0">ステップ2: コンポーネントの編集</a></li><li><a href="#toc4" tabindex="0">ステップ3: コンポーネントの使用</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">Angularのコンポーネントとは？</span></h2>



<p>Angularのアプリケーションは、<strong>コンポーネント（Component）</strong>という単位を組み合わせて構築されます。コンポーネントは、以下の3つの要素から構成されるのが基本です。</p>



<ol class="wp-block-list">
<li><strong>テンプレート (template)</strong>: UI (HTML) を定義する部分</li>



<li><strong>クラス (class)</strong>: ビジネスロジックや状態（プロパティ、メソッド）を定義する部分</li>



<li><strong>メタデータ (metadata)</strong>: デコレーター <code>@Component({...})</code> によってコンポーネントの設定を行う部分</li>
</ol>



<p>このように、見た目と振る舞いをひとまとめにした構造がコンポーネントです。<strong>HTML・CSS・TypeScript</strong>で作られるコンポーネントを必要に応じて組み合わせていくことで、大規模なアプリケーションでもスケーラブルかつ保守しやすい設計が可能になります。</p>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box not-nested-style cocoon-block-tab-caption-box"><div class="tab-caption-box-label block-box-label box-label fab-lightbulb"><span class="tab-caption-box-label-text block-box-label-text box-label-text">コンポーネントの本質を日常の例で考えると・・・</span></div><div class="tab-caption-box-content block-box-content box-content">
<p>コンポーネントは、<strong>LEGOブロック</strong>のようなものだと考えてみてください。</p>



<ul class="wp-block-list">
<li>LEGOブロックは、それぞれに<strong>形</strong>や<strong>機能</strong>があり、複数のブロックを組み合わせると最終的に1つのおもちゃを完成させることができます。</li>



<li>Angularアプリにおいても、コンポーネント(LEGOのパーツ)をいくつも用意して、それらを組み合わせることで最終的なWEBアプリが完成します。</li>
</ul>



<p class="is-style-stapler-top-left-box has-box-style"><strong>Legoブロックとの共通点</strong></p>



<ul class="wp-block-list">
<li><strong>再利用できる</strong>: 一度作ったコンポーネントを、いろいろな画面や機能で使い回すことができる</li>



<li><strong>組み合わせが自由</strong>: 必要に応じて順番や配置を変えて、UI（見た目）や機能（ロジック）を組み合わせられる</li>



<li><strong>単体で役割を持つ</strong>: それぞれのコンポーネントが「カードの表示役」「ボタンの管理」「プロフィールの表示」など、明確な役割を持つ</li>
</ul>
</div></div>



<p>これらのコンポーネントを組み合わせて１つのアプリケーションを構築します。各コンポーネントは独立しているため、必要に応じて簡単に追加、削除、または再利用することができます。家を建てるときに部屋を追加したり、デザインを変更したりするのと似ています。</p>



<p>まずは早速コンポーネントの作成を行ってみましょう。（<span class="badge">参考</span> <a href="https://it-biz.online/web-design/angular-loacl/">Angular開発環境構築手順</a>）</p>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box information-box">
<p class="has-text-align-center"><span class="badge-blue">前提事項１</span>　Angular CLIのインストール</p>



<p>Angular CLI（Command Line Interface）は、Angularアプリケーションの開発を助けるツールです。まだインストールしていない場合は、以下のコマンドを使用してインストールできます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">npm install -g @angular/cli</pre>



<p class="has-text-align-center"><span class="badge-blue">前提事項２</span>　Angularプロジェクトの作成</p>



<p>Angular CLIを使用して新しいプロジェクトを作成します。以下のコマンドを実行し、プロンプトに従ってプロジェクト名を入力します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">ng new プロジェクト名</pre>
</div>



<h2 class="wp-block-heading"><span id="toc2">ステップ1: コンポーネントの生成</span></h2>



<p>プロジェクトディレクトリ内で、Angular CLIの<code><span class="bold-blue">generate component</span></code>コマンドを使用して新しいコンポーネントを生成します。ターミナルやコマンドプロンプトを開き、次のコマンドを実行してください。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">ng generate component コンポーネント名</pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>以下のように短縮形を使用することもできます。</p>
</div></div>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">ng g c コンポーネント名</pre>



<p>このコマンドは、指定したコンポーネント名で新しいディレクトリを作成し、その中にコンポーネントのクラスファイル（<code>.ts</code>）、テンプレートファイル（<code>.html</code>）、スタイルシートファイル（<code>.scss</code>または<code>.css</code>）、テストファイル（<code>.spec.ts</code>）を生成します。</p>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">コンポーネントの作成はルートディレクトリではなく、その配下にディレクトリを作成＆コンポーネント作成を行うこともできますか？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p>可能です。実際の開発現場では、Angularプロジェクトにおいてはコンポーネントを整理し、管理しやすくするために、プロジェクトのルートディレクトリではなく、その配下にディレクトリを作成してコンポーネントを分類することが一般的なプラクティスです。</p>



<p>たとえば、<code>users</code>ディレクトリ内に<code>user-profile</code>コンポーネントを生成したい場合、以下のようにコマンドを実行します：</p>
</div></dd></dl></div>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">ng generate component users/user-profile</pre>



<h2 class="wp-block-heading"><span id="toc3">ステップ2: コンポーネントの編集</span></h2>



<p>生成されたファイル（コンポーネントを構成する基本的なソースコードが生成されています）を編集して、コンポーネントのビジネスロジック、表示内容、スタイルを定義します。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>ここでは、簡単なコンポーネントの例を通して、これらのファイルが初期状態でどのようになっているか、そしてどのように編集するかを見ていきましょう。</p>
</div></div>



<p class="has-text-align-center"><span class="badge-green">事例</span>　<strong>ユーザープロフィールコンポーネント</strong></p>



<p class="has-text-align-center">初期のコード　<strong>user-profile.component.ts</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-user-profile',
  templateUrl: './user-profile.component.html',
  styleUrls: ['./user-profile.component.css']
})
export class UserProfileComponent implements OnInit {

  constructor() { }

  ngOnInit(): void {
  }

}</pre>



<p>コンポーネントを作成すると上記のようなコードが生成されています。基本的には、この<a href="https://it-biz.online/web-design/typescript-calss/">クラス</a>の中のロジックを開発していくことになります。</p>



<p>ここではわかりやすい例としてユーザー名と説明をコンポーネントクラスのプロパティとして追加します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-user-profile',
  templateUrl: './user-profile.component.html',
  styleUrls: ['./user-profile.component.css']
})
export class UserProfileComponent implements OnInit {
  userName: string = 'John Doe';
  userDescription: string = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.';

  constructor() { }

  ngOnInit(): void {
  }

}</pre>



<p class="has-text-align-center">初期のコード　<strong>user-profile.component.html</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;p>user-profile works!&lt;/p></pre>



<p>HTMLは上記の通りの状態で生成されます。</p>



<p>ここでは、ユーザー名と説明を表示するようにしたいので、Angularのデータバインディングを使用して、コンポーネントクラスのプロパティをテンプレートにバインドします。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;div class="user-profile">
  &lt;h2>{{ userName }}&lt;/h2>
  &lt;p>{{ userDescription }}&lt;/p>
&lt;/div></pre>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/web-design/div/">divタグ</a> / <a href="https://it-biz.online/web-design/h1-h6/">h2タグ</a> /<a href="https://it-biz.online/web-design/paragraph/">pタグ</a></p>



<p class="has-text-align-center">初期のコード　<strong>user-profile.component.css</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">/* ここにスタイルを追加します */</pre>



<p>CSSファイルには上記のように何も書かれていないのが初期状態です。ユーザープロフィールの見た目を整えるために以下のように編集します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="css" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">.user-profile {
  border: 1px solid #ddd;
  padding: 20px;
  border-radius: 8px;
}

h2 {
  color: #333;
}

p {
  color: #666;
}</pre>



<p>これで、<code><span class="bold-blue">UserProfileComponent</span></code>はユーザー名と説明を表示する簡単なUIを持つようになりました。コンポーネントクラスでデータを管理し、それをテンプレートにバインドして表示し、CSSでスタイリングを行う基本的なフローを理解することができました。</p>



<p>このプロセスは、Angularアプリケーションのほぼすべてのコンポーネントで共通していますので、あなたが作成したい機能に応じてコードを書き替えてください。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>最後に、作成したコンポーネントを利用する方法です。</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc4">ステップ3: コンポーネントの使用</span></h2>



<p>新しく生成したコンポーネントは、他のコンポーネントのテンプレート内で使用できます。コンポーネントのセレクター（<strong><span class="marker-under"><code>@Component</code>デコレーター</span></strong>内で定義されている）をHTMLタグとして追加することで、そのコンポーネントを呼び出せます。</p>



<p>例えば、<code><span class="bold-blue">app-my-new-component</span></code>というセレクターを持つコンポーネントがある場合、別のコンポーネントのテンプレート内で以下のように使用できます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;app-my-new-component>&lt;/app-my-new-component></pre>



<p>これで、アプリケーションに新しい機能や要素を追加するためのコンポーネントを簡単に生成・統合することができます。効果的なコンポーネント設計には、再利用可能で責任範囲が明確なコンポーネントを作成することが重要です。</p>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<p class="has-text-align-center"><span class="badge-green">まとめ</span>　<strong>Angularのコンポーネントとは？</strong></p>



<ul class="wp-block-list">
<li class="is-style-bottom-margin-1em has-bottom-margin">コンポーネントはAngularアプリケーションの基本的な構築ブロックであり、UI（ユーザーインターフェース）の一部分をカプセル化し管理します。</li>



<li class="is-style-bottom-margin-1em has-bottom-margin">それぞれのコンポーネントには、テンプレート（HTML）、スタイル（CSS）、およびビジネスロジック（TypeScript）が含まれます。</li>



<li>コンポーネントはデータバインディングと依存性注入を利用してアプリケーション内の他の部品とやり取りします。</li>
</ul>



<p class="has-text-align-center"><span class="badge-green">まとめ</span>　<strong>Angularのコンポーネントの作成方法</strong></p>



<ul class="wp-block-list">
<li class="is-style-bottom-margin-1em has-bottom-margin"><strong>ステップ1:</strong> Angular CLI（コマンドラインインターフェース）を使用してコンポーネントを生成します。例：<code>ng generate component my-new-component</code> または短縮形 <code>ng g c my-new-component</code>。</li>



<li class="is-style-bottom-margin-1em has-bottom-margin"><strong>ステップ2:</strong> コンポーネントクラス（<code>.ts</code>ファイル）にビジネスロジック（データとメソッド）を追加します。ここで、コンポーネントの振る舞いを定義します。</li>



<li class="is-style-bottom-margin-1em has-bottom-margin"><strong>ステップ3:</strong> テンプレートファイル（<code>.html</code>）を編集してUIを定義します。Angularのデータバインディングやディレクティブを利用して、動的なコンテンツを表示します。</li>



<li><strong>ステップ4:</strong> スタイルファイル（<code>.css</code>または<code>.scss</code>）でコンポーネントの見た目をカスタマイズします。</li>
</ul>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Angularとは？初心者向けに１０分でわかりやすく</title>
		<link>https://it-biz.online/web-design/what-is-angular/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Tue, 05 Mar 2024 00:00:00 +0000</pubDate>
				<category><![CDATA[TypeScript]]></category>
		<category><![CDATA[WEBデザイン]]></category>
		<category><![CDATA[Angular]]></category>
		<category><![CDATA[Web開発]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=8931</guid>

					<description><![CDATA[Angularは、Googleが主導して開発しているフロントエンドフレームワークです。 以前は「AngularJS」という名称でしたが、バージョン2から大幅に作りが変わり、単に「Angular」と呼ばれています（バージョ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><strong>Angular</strong>は、Googleが主導して開発している<strong>フロントエンドフレームワーク</strong>です。</p>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">フレームワークとは？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p>アプリケーションやシステムを作るための「土台」や「ひな形」となるもの。組み立て済みのパーツをイメージすると分かりやすいです。この組み立て済みのパーツを組み合わせて、1つのシステムを構築していくイメージをしてください。</p>
</div></dd></dl></div>



<p>以前は「AngularJS」という名称でしたが、バージョン2から大幅に作りが変わり、単に「Angular」と呼ばれています（バージョン2以降をまとめてAngularと呼ぶことが多いです）。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>このページではAngularとは何か？（どのような考え方で、どのような仕組みでWebアプリケーションを生成していくのか？）を平易な言葉でわかりやすく解説していきます。</p>
</div></div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-16" checked><label class="toc-title" for="toc-checkbox-16">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">Angularとは？</a></li><li><a href="#toc2" tabindex="0">Angularの基本的なディレクトリ構造</a><ol><li><a href="#toc3" tabindex="0">プロジェクトルート</a></li><li><a href="#toc4" tabindex="0">src/ フォルダ</a></li><li><a href="#toc5" tabindex="0">app/ フォルダ</a></li><li><a href="#toc6" tabindex="0">assets/ フォルダ</a></li><li><a href="#toc7" tabindex="0">environments/ フォルダ</a></li></ol></li><li><a href="#toc8" tabindex="0">Angular：コンポーネントとは？</a><ol><li><a href="#toc9" tabindex="0">TypeScriptクラス</a></li><li><a href="#toc10" tabindex="0">テンプレート（HTML）</a></li><li><a href="#toc11" tabindex="0">スタイル（CSS）</a></li></ol></li><li><a href="#toc12" tabindex="0">Angularの基本：モジュールとルートコンポーネント</a></li><li><a href="#toc13" tabindex="0">モジュール（NgModule）</a><ol><li><a href="#toc14" tabindex="0">わかりやすくイメージすると・・・</a></li><li><a href="#toc15" tabindex="0">2. AppModule（ルートモジュール）</a></li></ol></li><li><a href="#toc16" tabindex="0">ルートコンポーネント</a><ol><li><a href="#toc17" tabindex="0">1. アプリを立ち上げた瞬間に表示されるコンポーネント</a></li><li><a href="#toc18" tabindex="0">2. 他のコンポーネントを呼び出す“親”役</a></li></ol></li><li><a href="#toc19" tabindex="0">Angularの基本：データバインディング（Data Binding）</a><ol><li><a href="#toc20" tabindex="0">なぜデータバインディングが重要なのか？</a></li></ol></li><li><a href="#toc21" tabindex="0">まとめ — Angularのエッセンス</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">Angularとは？</span></h2>



<p>Angularとはシングルページアプリケーション（SPA）を構築するためのオープンソースのフロントエンドWebアプリケーションフレームワークです。TypeScript（<a href="https://it-biz.online/web-design/typescript-abc/">TypeScriptとは？</a>）で書かれており、アプリケーションのスケールに関わらず、構造化された方法でコードを管理し、拡張することができる点が特徴です。</p>



<p><span class="badge-green">ポイント</span>　<strong>なぜAngularを使うの？</strong></p>



<ul class="wp-block-list is-style-icon-list-circle has-list-style">
<li><strong>大規模開発に強い</strong>：複数人での開発や大規模プロジェクトでも、コードを整理しやすい仕組みが整っている。</li>



<li><strong>型のサポート（TypeScript）</strong>：AngularはTypeScriptが標準なので、型によってバグを早期に発見しやすく、開発効率を高められる。</li>



<li><strong>豊富なツールとエコシステム</strong>：CLI（Command Line Interface）のサポートや、テストを含むさまざまな開発フローが整備されてる。</li>
</ul>



<p><span class="marker-under">Angularのプロジェクトは、特定の<strong>ディレクトリ構造</strong>と<strong>ファイルセット</strong>で構成されています。</span>このディレクトリ構造といくつかのファイルが最初にAngularを理解するうえで非常に重要なので、初めに基本的なディレクトリ構成・ファイルの種類、およびそれらの関係性について説明します。</p>



<h2 class="wp-block-heading"><span id="toc2">Angularの基本的なディレクトリ構造</span></h2>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">プロジェクトルート
│
├── src/
│   ├── app/
│   │   ├── app.component.ts
│   │   ├── app.component.html
│   │   ├── app.component.css
│   │   └── {other components}/
│   │       ├── {component}.component.ts
│   │       ├── {component}.component.html
│   │       └── {component}.component.css
│   │
│   ├── assets/
│   │   └── {static files like images, fonts, etc.}
│   │
│   └── environments/
│       ├── environment.ts
│       └── environment.prod.ts
│
├── angular.json
└── package.json</pre>



<h3 class="wp-block-heading"><span id="toc3">プロジェクトルート</span></h3>



<h4 class="wp-block-heading">1. <code>angular.json</code></h4>



<ul class="wp-block-list">
<li><strong>Angular CLIの設定ファイル</strong>です。</li>



<li>プロジェクトのビルドやテスト、サーバーの起動などの挙動を、CLIがこのファイルをもとにコントロールします。</li>



<li>例えば、アセットの配置先やビルド設定の切り替えなど、Angular特有の設定がここに書かれています。</li>
</ul>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">Angular CLI とは？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p>Angularを効率的に利用するための<strong>コマンドラインツール</strong>です。プロジェクトの作成、設定、ビルド、テストなどを簡単に実行することができます。</p>
</div></dd></dl></div>



<h4 class="wp-block-heading">2. <code>package.json</code></h4>



<ul class="wp-block-list">
<li><strong><a href="https://it-biz.online/web-design/node-js/">Node.js</a>で管理されるパッケージやスクリプトの情報</strong>をまとめたファイルです。</li>



<li><code>dependencies</code>や<code>devDependencies</code>の欄に、プロジェクトで利用するライブラリやツールが記載されています。</li>



<li>Angularを動かすためのコマンド（たとえば<code>ng serve</code>）も、内部的にはここに書かれたパッケージを読み込んで動きます。</li>
</ul>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content"><strong>Node.js</strong>とは？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p>サーバーサイドでJavaScriptを実行するためのランタイム環境のこと。Angularの実行自体にはNode.jsは不要ですが、開発にはNode.jsが必要となります。<br>Node.js環境でビルドしてJavaScriptに変換し、ブラウザで実行可能な形にします。</p>
</div></dd></dl></div>



<h3 class="wp-block-heading"><span id="toc4">src/ フォルダ</span></h3>



<p>メインのソースコードを置くフォルダです。<br>Angularのアプリケーションは、<strong><span class="marker-under">基本的にこの<code>src</code>配下に書かれたものを読み込んで動きます。</span></strong></p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>なので、開発者は基本的にはこのsrcフォルダ配下のファイルを編集して（＝プログラミングして）システム構築をしていくことになります。</p>
</div></div>



<h3 class="wp-block-heading"><span id="toc5">app/ フォルダ</span></h3>



<ul class="wp-block-list is-style-icon-list-check-valid has-list-style">
<li><strong>アプリの中心となるフォルダ</strong>で、画面を構成する<code>コンポーネント</code>がまとめられています。</li>



<li><strong><code>app.component.ts/html/css</code></strong>
<ul class="wp-block-list">
<li><strong>アプリのルート（メイン）コンポーネント</strong>。Angularのアプリを起動したとき、最初に画面表示に関わるパーツです。</li>



<li><code>.ts</code> → コンポーネントのロジック（クラスやメソッド）</li>



<li><code>.html</code> → 画面表示のためのテンプレート</li>



<li><code>.css</code> → 見た目をデザインするスタイルシート</li>
</ul>
</li>



<li><strong><code>{other components}/</code></strong>
<ul class="wp-block-list">
<li>追加で作成したコンポーネントが入るディレクトリ。</li>



<li>それぞれ**<code>.component.ts/html/css</code>**の3つセットで構成され、1つの画面やパーツを表現します。</li>



<li>例: ログインフォーム用のコンポーネント、ユーザー一覧コンポーネントなど。</li>



<li><code>.ts</code>ファイルには「<code>@Component</code>デコレーター」が付いたクラスが書かれ、ビュー(<code>.html</code>)やスタイル(<code>.css</code>)を紐づけます。</li>
</ul>
</li>
</ul>



<p class="has-text-align-center"><span class="badge-green">ポイント</span>　<strong>ファイルの種類と内容</strong></p>



<figure class="wp-block-table aligncenter"><div class="scrollable-table stfc-sticky"><table><thead><tr><th>ファイルの拡張子</th><th>内容説明</th></tr></thead><tbody><tr><td><strong>.ts </strong>(TypeScript)</td><td>コンポーネントのクラス/ロジック/データモデルが定義される。Angularの多くの機能はこのTypeScriptを基にしている。</td></tr><tr><td><strong>.html</strong></td><td>コンポーネントのテンプレートファイル。UI（ユーザーインターフェース）を構築するためのHTMLマークアップが含まれる。</td></tr><tr><td><strong>.css</strong></td><td>コンポーネント専用のスタイルシート。コンポーネントの見た目（スタイル）を定義。</td></tr></tbody></table></div><figcaption class="wp-element-caption">Angularを構成する主要なファイル</figcaption></figure>



<h3 class="wp-block-heading"><span id="toc6">assets/ フォルダ</span></h3>



<ul class="wp-block-list">
<li><strong>画像やフォントなどの静的ファイル</strong>を置く場所。</li>



<li>ビルド時には自動的に成果物に含まれ、アプリ内で<code>/assets/～</code>のようなパスで参照できます。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc7">environments/ フォルダ</span></h3>



<ul class="wp-block-list">
<li>Angularアプリで使われる<strong>設定情報</strong>を環境別に分けて管理するためのフォルダ。</li>



<li><strong><code>environment.ts</code></strong>：通常の開発・テスト用設定。</li>



<li><strong><code>environment.prod.ts</code></strong>：本番リリース用の設定。</li>



<li>例）APIのエンドポイントや、APIキーなどを環境によって切り替えたいときに利用します。</li>
</ul>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box ok-box">
<p class="has-text-align-center"><strong>Angular：ディレクトリ構造のまとめ</strong></p>



<ul class="wp-block-list">
<li><strong><code>app/</code></strong>：アプリ本体のコンポーネントが集まる場所。ルートコンポーネント(<code>app.component.*</code>)を中心に、各機能ごとにコンポーネントを追加していきます。</li>



<li><strong><code>assets/</code></strong>：アプリで使う静的ファイルや画像を管理するフォルダ。</li>



<li><strong><code>environments/</code></strong>：開発用・本番用など、環境に応じた設定を切り替えるためのファイルを置くフォルダ。</li>



<li><strong><code>angular.json</code></strong>：Angular CLIが参照するビルドや設定情報をまとめたファイル。</li>



<li><strong><code>package.json</code></strong>：Node.jsのパッケージ管理やスクリプトが記載されたファイルで、プロジェクトのライブラリやコマンドが定義されています。</li>
</ul>
</div>



<p>この構造は、あくまでもAngularプロジェクトの基本的な骨格を示したもので、実際のプロジェクトでは追加のファイルやディレクトリが存在します。規模が大きくなるにつれ、ディレクトリの構造も大きくなっていきますが、とりあえずここではAngularの概要・骨格を明確にしていくために基本的な構造としての説明しておきます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>なんとなくの構造をみたところで、まずはAngular理解の最初のポイント「<strong>コンポーネント</strong>」について解説しておきます。</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc8">Angular：コンポーネントとは？</span></h2>



<p>Angularのキモとなるのが<strong><span class="marker-under">コンポーネント</span></strong>です。コンポーネントは、アプリケーションを構成する<strong>部品</strong>を指します。<br><strong>HTMLテンプレート</strong>・<strong>TypeScriptクラス</strong>・<strong>CSSスタイル</strong>の3つが基本セットとなり、これらがまとまって1つのコンポーネントとして機能します。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="800" height="328" src="https://it-biz.online/wp-content/uploads/2024/03/image-2-800x328.png" alt="Angularとは" class="wp-image-8935" srcset="https://it-biz.online/wp-content/uploads/2024/03/image-2-800x328.png 800w, https://it-biz.online/wp-content/uploads/2024/03/image-2-500x205.png 500w, https://it-biz.online/wp-content/uploads/2024/03/image-2-300x123.png 300w, https://it-biz.online/wp-content/uploads/2024/03/image-2-768x315.png 768w, https://it-biz.online/wp-content/uploads/2024/03/image-2.png 843w" sizes="(max-width: 800px) 100vw, 800px" /><figcaption class="wp-element-caption">図1：Angularの構造</figcaption></figure>



<ol class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li><strong>TypeScriptファイル（例: <code>app.component.ts</code>）</strong>
<ul class="wp-block-list">
<li>コンポーネントの振る舞い（ロジック）を定義するクラス。</li>



<li><code>@Component</code>デコレーターを使って、テンプレートやスタイルなどを紐づけます。</li>
</ul>
</li>



<li><strong>HTMLファイル（例: <code>app.component.html</code>）</strong>
<ul class="wp-block-list">
<li>コンポーネントのビュー（UI）を定義するテンプレート。</li>
</ul>
</li>



<li><strong>CSSファイル（例: <code>app.component.css</code>）</strong>
<ul class="wp-block-list">
<li>コンポーネントの見た目（デザイン）を定義するスタイルシート。</li>
</ul>
</li>
</ol>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>ここでは、以下のようなページを作ると想定して、それぞれの役割を解説していきます。</p>



<p>これを作るために「<strong>トップページ用のコンポーネント</strong>」を用意するイメージです。<br>（実際のAngularアプリでは最初に生成される <code>app.component</code> がトップページの役割を担うことが多いです）</p>
</div></div>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ul class="wp-block-list">
<li>大きなタイトル「Welcome to My Website」</li>



<li>文章「ここでは素敵な情報をお届けします。」</li>



<li>ボタンを押すとタイトルが変わる</li>
</ul>
</blockquote>



<h3 class="wp-block-heading"><span id="toc9">TypeScriptクラス</span></h3>



<p><strong>TypeScriptクラス</strong>はコンポーネントの<strong><span class="marker-under">データ（状態）とロジック（振る舞い）を担当</span></strong>する部分です。</p>



<p>簡単に言えば<strong>どんなデータを持つ？</strong>（例: タイトル文字列）<strong>ボタンが押されたら何をする？</strong>（例: タイトルを変える）などといった<strong>頭脳・司令塔の役割</strong>を果たします。</p>



<p><span class="badge-blue">サンプルコード</span>　<code>app.component.ts</code> のイメージ例</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// app.component.ts
import { Component } from '@angular/core';

@Component({
  selector: 'app-root',            // HTML上で &lt;app-root> と書けば表示される
  templateUrl: './app.component.html', // 画面の骨組み（HTML）
  styleUrls: ['./app.component.css']   // 見た目（CSS）
})
export class AppComponent {
  title = 'Welcome to My Website'; 
  description = 'ここでは素敵な情報をお届けします。';

  changeTitle() {
    this.title = 'New Title! ようこそ！';
  }
}
</pre>



<h4 class="wp-block-heading">基本構文ルール</h4>



<p>TypeScriptクラスは<strong><span class="marker-under"><code>@Component</code>デコレーター</span></strong>で修飾され、Angularに対してこれがコンポーネントであることを示します。このデコレーターは、セレクタ、テンプレートURL、スタイルURLなど、コンポーネントに関連するメタデータを指定します。</p>



<p class="is-style-border-left-box has-box-style"><strong>1. インポート文</strong></p>



<p>Angularコアライブラリやその他必要なモジュール、コンポーネント、サービスなどから、必要な機能やデータ型をインポートします。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import { Component } from '@angular/core';
</pre>



<p class="is-style-border-left-box has-box-style"><strong>2. @Componentデコレーター</strong></p>



<p><strong>@Component</strong>デコレーターは、<strong><span class="marker-under">クラスがAngularコンポーネントであることを示す役割</span></strong>を担います。また、コンポーネントのメタデータ（コンポーネントを識別するための名前・使用するテンプレートファイルのパス・およびコンポーネント専用のスタイルファイルのパス）が含まれます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">@Component({
  selector: 'app-root',            // HTML上で &lt;app-root> と書けば表示される
  templateUrl: './app.component.html', // 画面の骨組み（HTML）
  styleUrls: ['./app.component.css']   // 見た目（CSS）
})
</pre>



<p class="is-style-border-left-box has-box-style"><strong>3. コンポーネントクラス</strong></p>



<p>コンポーネントの振る舞いを定義するクラスです。<code>title</code> や <code>description</code> が、このコンポーネント（トップページ）のデータ。<code>changeTitle()</code> は、「ボタンをクリックしたらタイトルを変更する」ためのメソッドです。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">export class AppComponent {
  title = 'Welcome to My Website'; 
  description = 'ここでは素敵な情報をお届けします。';

  changeTitle() {
    this.title = 'New Title! ようこそ！';
  }
}
</pre>



<h3 class="wp-block-heading"><span id="toc10">テンプレート（HTML）</span></h3>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>続いて、テンプレートについて。</p>
</div></div>



<ul class="wp-block-list">
<li>画面の見た目の骨組みを記述するもの。</li>



<li>さきほどの TypeScript ファイル（クラス）で定義した <strong><code>title</code></strong>や<strong><code>description</code></strong>、<strong><code>changeTitle()</code></strong> を「<strong>使う場所</strong>」です。もっと言えば単なる<a href="https://it-biz.online/web-design/html-basic/">HTMLファイル</a>です。</li>
</ul>



<p class="has-text-align-left"><span class="badge-blue">サンプル</span>　<code>app.component.html</code> のイメージ例</p>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;!-- app.component.html -->
&lt;h1>{{ title }}&lt;/h1>  &lt;!-- {{ }} で TypeScriptのtitleを表示 -->
&lt;p>{{ description }}&lt;/p>

&lt;button (click)="changeTitle()">タイトルを変更&lt;/button>
</pre>



<ul class="wp-block-list">
<li><code>{{ title }}</code> の部分が、<code>AppComponent</code> クラスの <code>title</code> プロパティを画面に差し込みます（<strong>データバインディング</strong>）。</li>



<li><code>(click)="changeTitle()"</code> は、ボタンがクリックされたときに <code>changeTitle()</code> メソッドを呼び出す設定。</li>



<li>もしボタンを押したら、TypeScript側で <code>title</code> が更新されて、画面上のタイトルが変わります。</li>
</ul>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">データバインディングとは？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p>データバインディングとは、プログラム内のデータと画面（ユーザーインターフェース）を自動的に同期する仕組みのことです。例えば、画面に表示された値を変更すると、その値がプログラムのデータにも反映され、逆にプログラムのデータを変更すると画面の表示も更新されます。（<strong><span class="marker-under">最後</span><span class="marker-under">の章で詳細を解説します</span></strong>）</p>
</div></dd></dl></div>



<h3 class="wp-block-heading"><span id="toc11">スタイル（CSS）</span></h3>



<p>スタイルでは、コンポーネントの見た目を定義します。スタイルはコンポーネントにローカルに適用され、他のコンポーネントには影響を与えません。</p>



<p class="has-text-align-left"><span class="badge-blue">サンプル</span>　<code>app.component.css</code> のイメージ例</p>



<pre class="EnlighterJSRAW" data-enlighter-language="css" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">/* app.component.css */
h1 {
  color: navy;
  font-size: 2rem;
  margin-bottom: 10px;
}

button {
  background-color: orange;
  border: none;
  padding: 8px 16px;
  cursor: pointer;
  color: #fff;
}

button:hover {
  background-color: darkorange;
}
</pre>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box information-box">
<p class="has-text-align-center is-style-clip-box has-box-style">Angularの基本「コンポーネント」のざっくりフロー</p>



<ol class="wp-block-list">
<li><strong>HTML（app.component.html）</strong>：<br>画面で <code>&lt;h1>{{ title }}&lt;/h1></code> の部分を表示したい → どこのデータ？ → <strong>TSファイルの <code>title</code></strong></li>



<li><strong>TypeScript（app.component.ts）</strong>：<br><code>title</code> は <code>'Welcome to My Website'</code> だから、画面にはこの文字が出る。<br>ボタンを押すと <code>changeTitle()</code> が呼ばれる → <code>title</code> が <code>'New Title! ようこそ！'</code> に変わる → 画面が自動的に更新される</li>



<li><strong>CSS（app.component.css）</strong>：<br><code>h1</code> は <strong>navy色</strong>、<code>button</code> は <strong>オレンジ色</strong>に見える。<br>他のコンポーネントに影響せず、このコンポーネントの見た目だけを変えられる。</li>
</ol>
</div>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box not-nested-style cocoon-block-tab-caption-box"><div class="tab-caption-box-label block-box-label box-label fab-lightbulb"><span class="tab-caption-box-label-text block-box-label-text box-label-text">サンプル：コンポーネント</span></div><div class="tab-caption-box-content block-box-content box-content">
<p class="has-text-align-center"><span class="badge-green">サンプル</span>　<strong>ユーザー名を表示するコンポーネント</strong></p>



<p>コンポーネントの理解を深めるためにもう１つ別の実践的なサンプルコードを置いておきます。</p>



<p class="has-text-align-center is-style-memo-box has-box-style">１：TypeScriptクラスファイル: コンポーネントの定義：<strong>user.component.ts</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import { Component } from '@angular/core';

@Component({
  selector: 'app-user', // コンポーネントのセレクター
  templateUrl: './user.component.html', // テンプレートファイルへのパス
  styleUrls: ['./user.component.css'] // スタイルファイルへのパス
})
export class UserComponent {
  userName = 'John Doe'; // テンプレートで表示するためのユーザー名
}</pre>



<p>このTypeScriptファイルでは<code>@Component</code>デコレータを使用して、コンポーネントのメタデータ（セレクタ、テンプレートURL、スタイルURL）を定義し、コンポーネントクラス<code>UserComponent</code>に<code>userName</code>プロパティを定義しています。</p>



<p class="has-text-align-center is-style-memo-box has-box-style">2：HTMLテンプレートファイル: UIの定義：<strong>user.component.html</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;div class="user">
  User Name: {{ userName }}
&lt;/div></pre>



<p>HTMLテンプレートファイルでは、データバインディングを使用してTypeScriptクラスの<code>userName</code>プロパティを表示しています。</p>



<p class="has-text-align-center is-style-memo-box has-box-style">3：CSSスタイルファイル: コンポーネントのスタイル定義：<strong>user.component.css</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="css" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">.user {
  color: blue;
  font-weight: bold;
}</pre>



<p>CSSスタイルファイルでは、テンプレートの<code>.user</code>クラスに対してスタイルを定義しています。</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc12">Angularの基本：モジュールとルートコンポーネント</span></h2>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>ここまで学んできたように、<strong>Angularのコンポーネント</strong>は「HTML＋TypeScript＋CSS」の3つがセットになった“アプリの部品”です。</p>
</div></div>



<p>しかし、<strong>単体のコンポーネント</strong>だけではアプリ全体を構築できません。複数のコンポーネント同士をどうまとめるか？ そして、<strong>アプリを起動したときに最初に表示されるコンポーネント</strong>はどれなのか？ それらを管理・決定するのが <strong>モジュール（NgModule）</strong> と <strong>ルートコンポーネント</strong> です。ここでは、モジュールとルートコンポーネントについて説明しておきます。</p>



<h2 class="wp-block-heading"><span id="toc13">モジュール（NgModule）</span></h2>



<p>Angularでは、アプリを構成するコンポーネントやサービス、パイプなどを<strong>ひとまとまり</strong>に管理する仕組みとして、<strong>モジュール（NgModule）</strong>が用意されています。</p>



<ul class="wp-block-list">
<li>いわば「アプリの基盤（土台）」。</li>



<li>「どんなコンポーネントを使うか」「どの外部ライブラリを読み込むか」を<strong>登録</strong>する場所です。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc14">わかりやすくイメージすると・・・</span></h3>



<ul class="wp-block-list">
<li><strong>コンポーネント</strong>：おもちゃのブロック（赤・青・緑などの色や形を持つ小さなピース）。</li>



<li><strong>モジュール</strong>：ブロックを収納する整理箱（1つの箱には、同じシリーズのブロックをまとめて入れる）。</li>
</ul>



<p>システムでの例：</p>



<ul class="wp-block-list">
<li><strong>コンポーネント</strong>：フォームの「名前入力欄」や「送信ボタン」。</li>



<li><strong>モジュール</strong>：「ユーザー登録モジュール」として、フォーム全体＋登録処理ロジックを1つのまとまりとして管理。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc15">2. AppModule（ルートモジュール）</span></h3>



<p>Angularアプリを起動するとき、最初に読み込まれるモジュールが<strong>ルートモジュール</strong>（Root Module）です。「アプリの起動に必要な設定」をすべて集めた“<strong>入り口</strong>”のような存在。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>ルートモジュールは、<strong>「一番大きな箱」</strong>と考えるとわかりやすいです。この箱は、すべてのコンポーネントやモジュールを一元管理し、システム全体の「司令塔」として機能します。</p>
</div></div>



<ol class="wp-block-list">
<li><strong>コンポーネントを宣言</strong>（<code>declarations</code>）</li>



<li><strong>使いたい外部モジュールをインポート</strong>（<code>imports</code>）</li>



<li><strong><span class="marker-under">アプリ起動時に使うコンポーネントを指定</span></strong>（<code>bootstrap</code>）<br>…などを設定します。</li>
</ol>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// app.module.ts の例
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppComponent } from './app.component';  // ルートコンポーネント

@NgModule({
  declarations: [    // このアプリ内で使うコンポーネント等を登録
    AppComponent
  ],
  imports: [         // 他のモジュール(機能)を読み込む
    BrowserModule
  ],
  providers: [],
  bootstrap: [AppComponent] // 起動時に表示されるコンポーネントを指定
})
export class AppModule {}
</pre>



<h4 class="wp-block-heading">なぜ「ルートモジュール」が必要なのか？</h4>



<ul class="wp-block-list">
<li>Angularは<strong>複数のモジュールを組み合わせ</strong>て大きなアプリを作れる仕組みですが、どこか一つ「最初に読み込む」モジュールが必要になります。</li>



<li>ルートモジュールは、これらの<strong>まとめ役＆アプリのスタート地点</strong>として存在しているわけです。</li>
</ul>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box information-box">
<ol class="wp-block-list">
<li><strong>ルートモジュール（Root Module）</strong> = <strong>アプリの入り口＆土台</strong>
<ul class="wp-block-list">
<li>ほとんどのAngularアプリでは <code>AppModule</code>（<code>app.module.ts</code>）がその役割。</li>
</ul>
</li>



<li><strong>主な役割</strong>
<ul class="wp-block-list">
<li>コンポーネントを登録する（<code>declarations</code>）</li>



<li>他のモジュールを読み込む（<code>imports</code>）</li>



<li>最初に表示するコンポーネントを指示する（<code>bootstrap</code>）</li>
</ul>
</li>



<li><strong>イメージ</strong>
<ul class="wp-block-list">
<li>「Angularアプリを立ち上げるためにまず読み込む設定ファイル」</li>



<li>「アプリを総括し、使う部品・機能を一括で把握する場所」</li>
</ul>
</li>
</ol>
</div>



<h2 class="wp-block-heading"><span id="toc16">ルートコンポーネント</span></h2>



<h3 class="wp-block-heading"><span id="toc17">1. アプリを立ち上げた瞬間に表示されるコンポーネント</span></h3>



<p>通常、<code>AppComponent</code>（<code>app.component.ts</code>）が「ルートコンポーネント」の役割を担います。</p>



<ul class="wp-block-list">
<li>ユーザーがブラウザでページを開いたとき、<strong>真っ先に表示</strong>されるコンポーネントです。</li>



<li><code>index.html</code> 内の <code>&lt;app-root>&lt;/app-root></code> タグに差し込まれる形で画面に描画されます。</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// app.component.ts の例
import { Component } from '@angular/core';

@Component({
  selector: 'app-root',               // &lt;app-root> で呼び出せる
  templateUrl: './app.component.html', // HTMLテンプレート
  styleUrls: ['./app.component.css']   // CSSスタイル
})
export class AppComponent {
  title = 'My Angular App';
}
</pre>



<ul class="wp-block-list">
<li>このクラスに記載した<code>title</code>などのプロパティやメソッドが、「ルートページ」の表示や挙動を定義します。</li>



<li><code>&lt;app-root></code> タグを使うと、このコンポーネントが表示されます。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc18">2. 他のコンポーネントを呼び出す“親”役</span></h3>



<ul class="wp-block-list">
<li>ルートコンポーネントは、アプリ全体の“親”のような存在。</li>



<li>画面の上部にヘッダーを表示したり、各ページを切り替えるためのルーターを配置したりします。</li>



<li>実際の大規模アプリでは、ルートコンポーネントが子コンポーネントを呼び出し、さらにその下に孫コンポーネント…といった階層構造で画面を作り上げていきます。</li>
</ul>



<h2 class="wp-block-heading has-text-align-left"><span id="toc19">Angularの基本：データバインディング（Data Binding）</span></h2>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>最後に、データバインディングについて。これさえ押さえれば、Angularの全体像がなんとなく見えてくるはずです。</p>
</div></div>



<p><strong>データバインディング（Data Binding）<strong>とは、コンポーネント(主にTypeScript側)で持っているデータや処理を、HTMLテンプレート側と</strong>自動的に同期</strong>させる仕組みのことです。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="568" height="206" src="https://it-biz.online/wp-content/uploads/2024/03/image-23.png" alt="Angular データバインディング" class="wp-image-9030" srcset="https://it-biz.online/wp-content/uploads/2024/03/image-23.png 568w, https://it-biz.online/wp-content/uploads/2024/03/image-23-500x181.png 500w, https://it-biz.online/wp-content/uploads/2024/03/image-23-300x109.png 300w" sizes="(max-width: 568px) 100vw, 568px" /><figcaption class="wp-element-caption">図2：Angular データバインディング</figcaption></figure>



<p>この仕組みのおかげで「変数の値を画面に表示する」「ボタンをクリックしたときに処理を実行し、画面を更新する」などがスムーズに行うことができるようになります。</p>



<h3 class="wp-block-heading"><span id="toc20">なぜデータバインディングが重要なのか？</span></h3>



<p>従来のWeb開発（例えばjQueryなど）であれば、</p>



<ol class="wp-block-list">
<li>値が変わったら、手動で<a href="https://it-biz.online/web-design/dom/">DOM</a>を更新する</li>



<li>クリックイベントを設定して、手動で値を書き換える<br>…と、画面とデータを結びつけるために<strong>都度DOM操作</strong>を行う必要がありました。</li>
</ol>



<p>Angularのデータバインディングでは、<strong>データが変われば画面も自動的に更新される</strong>、あるいは<strong>画面操作があればデータが自動的に変わる</strong>といった仕組みが用意されており、開発がシンプルになります。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>データバインディングについては、別の記事で詳しく解説しています。併せてご覧ください。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">

<a href="https://it-biz.online/web-design/angular-binding/" title="Angular：データバインディングの基礎を1からわかりやすく" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-biz.online/wp-content/uploads/2024/03/image-22-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-biz.online/wp-content/uploads/2024/03/image-22-320x180.png 320w, https://it-biz.online/wp-content/uploads/2024/03/image-22-240x135.png 240w, https://it-biz.online/wp-content/uploads/2024/03/image-22-640x360.png 640w" sizes="(max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Angular：データバインディングの基礎を1からわかりやすく</div><div class="blogcard-snippet internal-blogcard-snippet">Angularのデータバインディングの基本から応用までをわかりやすく解説。補間、プロパティ、イベント、双方向バインディングの使い方とメリットを紹介。Web開発者必見。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-biz.online" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-biz.online</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2025.01.14</div></div></div></div></a>
</div></figure>
</div></div>



<h2 class="wp-block-heading"><span id="toc21">まとめ — Angularのエッセンス</span></h2>



<ul class="wp-block-list">
<li><strong>コンポーネント</strong>＝アプリのパーツを<strong>HTMLテンプレート</strong>＋<strong>TypeScriptクラス</strong>＋<strong>CSSスタイル</strong>でまとめたもの。</li>



<li><strong>データバインディング</strong>＝コンポーネントのロジックと画面表示を効率よく結びつける仕組み。</li>



<li><strong>モジュール</strong>＝コンポーネントやサービスなどを整理・登録してアプリとしてまとめる入れ物。</li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Angular：NgRx（状態管理ライブラリ）の基本を５分で整理する</title>
		<link>https://it-biz.online/web-design/angular-ngrx/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Tue, 26 Mar 2024 06:42:51 +0000</pubDate>
				<category><![CDATA[TypeScript]]></category>
		<category><![CDATA[WEBデザイン]]></category>
		<category><![CDATA[Angular]]></category>
		<category><![CDATA[Web開発]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=9042</guid>

					<description><![CDATA[NgRxとは、Angular用の状態管理ライブラリです。簡単に言うと、アプリケーションのデータ（状態）を一箇所で管理し、どこからでもそのデータにアクセスしたり更新したりできるようにするツールです。 アプリケーションのデー [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><strong>NgRx</strong>とは、<a href="https://it-biz.online/web-design/what-is-angular/">Angular</a>用の状態管理ライブラリです。簡単に言うと、<strong><span class="marker-under">アプリケーションのデータ（状態）を一箇所で管理し、どこからでもそのデータにアクセスしたり更新したりできるようにするツール</span></strong>です。</p>



<p>アプリケーションのデータ（状態）とは、例えばログインしているユーザーのプロフィール情報だったり、ユーザーがログインしているかどうか・ユーザがショッピングカートに追加した商品の状態などが該当します。NgRxを使うと、この「データの変化」をきちんと管理しやすくなり、大きなアプリケーションでもデータの流れを追いやすくなります。</p>



<p>NgRxはアプリケーションのデータを効率的に管理するための道具箱のようなものです。NgRxを利用することで、アプリケーションが複雑になっても、データの管理を適切に行うことでバグを減らし、開発をスムーズに進めることができるようになります。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>このページでは<strong>そもそも状態管理ライブラリって何？なぜ状態管理が重要なの？NgRxはどのように利用するの？</strong>という疑問をお持ちの方向けに１からわかりやすく解説します。</p>
</div></div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-18" checked><label class="toc-title" for="toc-checkbox-18">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">「状態管理」はなぜ重要か</a></li><li><a href="#toc2" tabindex="0">NgRxを使った状態管理の仕組み</a></li><li><a href="#toc3" tabindex="0">NgRxの実装</a><ol><li><a href="#toc4" tabindex="0">Store（ストア）のセットアップ</a></li><li><a href="#toc5" tabindex="0">Actions（アクション）の定義</a></li><li><a href="#toc6" tabindex="0">Reducers（リデューサー）の作成</a></li><li><a href="#toc7" tabindex="0">Effects（エフェクト）の実装</a></li></ol></li><li><a href="#toc8" tabindex="0">セレクタの使用/コンポーネントとの統合</a><ol><li><a href="#toc9" tabindex="0">Selector（セレクタ）の使用</a></li><li><a href="#toc10" tabindex="0">セレクタの作り方</a></li><li><a href="#toc11" tabindex="0">セレクタの使い方</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">「状態管理」はなぜ重要か</span></h2>



<p>まず初めになぜ「状態管理が重要なのか？」について説明します。結論から言えば、状態管理は<strong>アプリの一貫性・リアルタイム性を実現するため</strong>、また開発者にとっては<strong>バグの発見と修正を早くすることを可能にする</strong>という点で重要だと言えます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>具体的に簡単なソーシャルメディアアプリを例にとってその重要性を考えていきたいと思います。</p>
</div></div>



<p><strong>1. ユーザーの投稿リストの例</strong></p>



<p>アプリにログインすると、友達やフォローしている人たちの最新の投稿がフィードに表示される機能の場合。まず、ここでの「投稿リスト」が１つの<strong>状態管理</strong>です（ユーザの友達・フォローしている人などによって状態が変わるので）。</p>



<p>ユーザーが新たに投稿を行うと、その投稿はリストの最上部に追加され、他のユーザーが投稿をするたびに、フィードがリアルタイムで更新されます。ログインするユーザによって何を表示するのか？（＝表示すべき投稿の内容）を管理する仕組みが重要になります。</p>



<p><strong>2. 「いいね！」やコメントの例</strong></p>



<p>投稿に対して「いいね！」をするかコメントをすると、その情報を即座に投稿の状態に反映する機能を考えてみましょう。たとえば、あなたがある投稿に「いいね！」をした場合、その「いいね！」の数が更新され、他の人がその投稿を見たときにもその更新が反映されているべきです。この「いいね！」やコメントも、１つの<strong>状態管理</strong>です。</p>



<p><strong>3. 通知システム</strong></p>



<p>誰かがあなたの投稿に「いいね！」をしたり、コメントをしたりすると、通知が届きます。この通知もまた、アプリの状態の一部であり、リアルタイムで更新される必要があります。</p>



<p>また、考えてみれば当たり前のことですが、同じアプリを異なるデバイスで開いたとき（たとえばスマホとタブレット）、または同じデバイスでも異なる画面では（たとえばフィード画面とプロフィール画面）、ユーザーに対して一貫した情報（投稿、コメント、いいねの数）を表示する必要があります。もし、状態管理がしっかりしていなければ、これらの情報を一元的に更新し、どこからアクセスしても同じ情報を見ることはできなくなってしまいます。</p>



<p>このように、状態管理は特に複雑なWebアプリケーションにおいて非常に重要な役割を担います。もし、状態管理が適切になされていなければ、ユーザのプロフィールが同時にログインしている他のユーザから参照できてしまったり、自分の投稿が他の人から見られなくなってしまったり・・・というような弊害が出てきます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>この状態管理をしやすくするためのAngularのツールの１つが<strong>NgRx</strong>です。</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc2">NgRxを使った状態管理の仕組み</span></h2>



<p>NgRxを使った状態管理の仕組みを解説します。結論から言うと、NgRxでは以下４つの概念で１つの状態を管理しています。</p>



<p class="has-text-align-center"><span class="badge-green">ポイント</span>　<strong>NgRxの4つの主要な部品</strong></p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="713" height="375" src="https://it-biz.online/wp-content/uploads/2024/03/image-28.png" alt="Angular NgRX" class="wp-image-9063" srcset="https://it-biz.online/wp-content/uploads/2024/03/image-28.png 713w, https://it-biz.online/wp-content/uploads/2024/03/image-28-500x263.png 500w, https://it-biz.online/wp-content/uploads/2024/03/image-28-300x158.png 300w" sizes="(max-width: 713px) 100vw, 713px" /></figure>



<ol class="wp-block-list">
<li class="is-style-bottom-margin-1em has-bottom-margin"><strong><span class="marker-under">ストア（Store）</span></strong>
<ul class="wp-block-list">
<li>アプリのデータ（状態）が全部入っている大きな箱のようなもの。アプリのどこからでもこの箱の中身を見ることができ、必要なデータを取り出したり、新しいデータを追加したりすることができます。</li>
</ul>
</li>



<li class="is-style-bottom-margin-1em has-bottom-margin"><strong><span class="marker-under">アクション（Actions）</span></strong>
<ul class="wp-block-list">
<li>ユーザーが何か行動を起こしたとき（例えば、新しい投稿をする、コメントをする、いいね！をするなど）、その行動をアプリに伝えるメッセージです。このメッセージは「何をしたいのか」という情報を伝えます。</li>
</ul>
</li>



<li class="is-style-bottom-margin-1em has-bottom-margin"><strong><span class="marker-under">リデューサー（Reducers）</span></strong>
<ul class="wp-block-list">
<li>アクションからメッセージが来たときに「ストアのデータをどう変えるか」を決めるルールブックです。例えば、「新しい投稿アクション」が来たら、「投稿リストに新しい投稿を追加する」といった具体的な指示が含まれます。</li>
</ul>
</li>



<li><strong><span class="marker-under">エフェクト（Effects）</span></strong>
<ul class="wp-block-list">
<li>アプリの外の世界（<a href="https://it-biz.online/it-skills/server-abc/">サーバー</a>や<a href="https://it-biz.online/it-skills/database/">データベース</a>など）と通信する必要があるときに使います。例えば、新しい投稿をサーバーに保存する、サーバーから最新の投稿リストを取得するといった場合です。エフェクトは、これらの操作が完了したときに、その結果をアプリに伝える新しいアクションを発行します。</li>
</ul>
</li>
</ol>



<p>実際のアプリを例にその流れを大まかに説明すると、ユーザーが新しい投稿を作成するとき「新しい投稿アクション」が発行される→このアクションはリデューサーによって処理され、ストアの「投稿リスト」データが新しい投稿で更新される→エフェクトがこのアクションを検知し、新しい投稿をサーバーに保存するための処理を行う、というような流れ。</p>



<p>つまり、このような仕組みでNgRxはアプリのデータ（状態）の変更を<strong><span class="marker-under">一元管理</span></strong>し、複雑なアプリケーションでもデータの流れを追跡しやすく、かつ効率的に非同期処理を管理します。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>上記の図はNgRx理解の最重要ポイントです。</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc3">NgRxの実装</span></h2>



<p>ここからは、上記の基本知識をさらに深めるため、実際にAngularでNgRxライブラリを用いたコードを記述していきたいと思います。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>なんといっても、実装ができてなんぼの世界なので、１個１個丁寧に理解しておきましょう。</p>
</div></div>



<h3 class="wp-block-heading"><span id="toc4">Store（ストア）のセットアップ</span></h3>



<p>まず、アプリケーションのルートモジュールに<strong>NgRxストア</strong>をセットアップします。ストアは、アプリケーションの状態を保持するための容器です。これを設定することで、アプリケーション全体で状態を一貫性を持って管理できるようになります。</p>



<h4 class="wp-block-heading">ステップ1: NgRxモジュールのインストール</h4>



<p>まず、プロジェクトにNgRxをインストールする必要があります。コマンドラインまたはターミナルで以下のコマンドを実行して、NgRxをプロジェクトに追加します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">yarn add @ngrx/store</pre>



<p>「NgRxをインストールする」というのは、実際には「<strong>NgRxのライブラリを自分のプロジェクトに追加する</strong>」という意味です。ライブラリとは、あらかじめ書かれたコードのセットで、特定の機能を提供するものです。</p>



<h4 class="wp-block-heading">ステップ2: アプリケーションモジュールの設定</h4>



<p>NgRxのストアをセットアップするためには、アプリケーションのルートモジュール（<code><span class="blue">AppModule</span></code>）に<code><span class="blue">StoreModule</span></code>をインポートし、その<code><span class="blue">forRoot</span></code>メソッドを使ってストアを構成します。ここでは、まだ具体的なリデューサーを定義していないので、単にストアをセットアップする基本的なステップを踏みます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import { NgModule } from '@angular/core';
import { StoreModule } from '@ngrx/store';

@NgModule({
  imports: [
    // ...他のモジュールのインポート
    StoreModule.forRoot({}, {}) // ここで空のリデューサーマップと構成オプションを指定
  ],
  // ...他のNgModuleメタデータ
})
export class AppModule { }</pre>



<p>↑のコードでは、<code><span class="blue">forRoot</span></code>メソッドに空のオブジェクトを2つ渡しています。１つ目の空のオブジェクトは、アプリケーションの状態を管理するリデューサーの関数を指定するのですが、現時点ではリデューサーがまだないため空にしています。</p>



<h3 class="wp-block-heading"><span id="toc5">Actions（アクション）の定義</span></h3>



<p>アクションは、アプリケーションで何かが起きたことを伝えるメッセージのようなものです。例えば、「ログインボタンがクリックされた」「商品がカートに追加された」といったユーザーの操作や、アプリケーションの状態変化を示します。</p>



<p>早速Actions（アクション）の定義をしていきましょう。</p>



<h4 class="wp-block-heading">ステップ1: アクションの目的を決める</h4>



<p>まず、どんな操作やイベントに対してアクションが必要かを考えます。例えば、ユーザー認証なら「ログイン実行」「ログイン成功」「ログイン失敗」が考えられます。</p>



<h4 class="wp-block-heading">ステップ2: アクションファイルを作成する</h4>



<p><code><span class="blue">src/app/actions</span></code> ディレクトリに、機能ごとに分かれたアクションファイル（例：<code><span class="blue">auth.actions.ts</span></code>）を作成します。一応ディレクトリはどこに作成しても良いのですが、１つのディレクトリにアクションファイルを集めておくのがよく見かける管理方法の１つです。</p>



<h4 class="wp-block-heading">ステップ3: <code>createAction</code>を使ってアクションを定義する</h4>



<p><code><span class="blue">@ngrx/store</span></code>では、<code><span class="blue">createAction</span></code>関数を利用してアクションを定義します。まず、この関数を使えるようにするために、<code><span class="blue">@ngrx/store</span></code>から<code><span class="blue">createAction</span></code>をインポートします。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import { createAction } from '@ngrx/store';</pre>



<p>次に、<code><span class="blue">createAction</span></code>関数を使ってアクションを定義。この関数には少なくとも1つ、アクションの種類を示す文字列：<strong>アクションタイプ</strong>を渡します。アクションタイプ（Action Type）は、NgRxなどの状態管理ライブラリにおいて、<strong>アクションを一意に識別するための文字列</strong>です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">export const loginStart = createAction('[Auth] Login Start');</pre>



<h4 class="wp-block-heading">ステップ4: 必要に応じてペイロードを定義</h4>



<p>アクションに<strong><span class="marker-under">追加のデータ（ペイロード）</span></strong>を含めたい場合は、<code><span class="blue">props</span></code>関数を使ってその形状を定義します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import { createAction, props } from '@ngrx/store';

export const loginStart = createAction(
  '[Auth] Login Start',
  props&lt;{ username: string; password: string }>()
);</pre>



<h4 class="wp-block-heading">ステップ5: アクションをエクスポートする</h4>



<p>定義したアクションは、他のファイルから使えるようにエクスポートします。これで、アクションをディスパッチする準備が整います。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>まとめると以下のような感じですね。</p>
</div></div>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import { createAction, props } from '@ngrx/store';

// ユーザーログインのアクション定義
export const loginStart = createAction(
  '[Auth] Login Start',
  props&lt;{ username: string; password: string }>()
);

// ログイン成功時のアクション定義
export const loginSuccess = createAction(
  '[Auth] Login Success',
  props&lt;{ userId: string; token: string }>()
);

// ログイン失敗時のアクション定義
export const loginFailure = createAction(
  '[Auth] Login Failure',
  props&lt;{ error: string }>()
);</pre>



<p>ちなみに、上記のコードを簡単に説明すると以下の通りになります。</p>



<ul class="wp-block-list">
<li><code><span class="bold-blue">loginStart</span></code>
<ul class="wp-block-list">
<li>ユーザーがログインを試みる際にディスパッチされ、ユーザー名とパスワードをペイロードとして含みます。</li>
</ul>
</li>



<li><code><span class="bold-blue">loginSuccess</span></code>
<ul class="wp-block-list">
<li>ログインプロセスが成功した際にディスパッチされ、ユーザーIDと認証トークンをペイロードとして含みます。</li>
</ul>
</li>



<li><code><span class="bold-blue">loginFailure</span></code>
<ul class="wp-block-list">
<li>ログインが失敗した際にディスパッチされ、エラーメッセージをペイロードとして含みます。</li>
</ul>
</li>
</ul>



<p>このようにアクションを定義することで、アプリケーションの状態管理ロジックがどのようなイベントに反応するべきか、そしてそれに応じてどのような状態変化を適用するかを明確にできます。</p>



<h3 class="wp-block-heading"><span id="toc6">Reducers（リデューサー）の作成</span></h3>



<p>リデューサーは、アクションが発生したときにアプリケーションの状態をどのように変更するかを定義する<a href="https://it-biz.online/web-design/typescript-function/">関数</a>です。ざっくり言えば「<strong>今の状態とアクションを受け取って、新しい状態を返す</strong>」という役割を担います。</p>



<h4 class="wp-block-heading">ステップ1: 状態の形状を定義する</h4>



<p>まず、管理したいデータ（状態）の形状を決めます。例えば、認証状態なら、ユーザー情報やログイン状態を含むオブジェクトになるでしょう。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">interface AuthState {
  user: User | null;
  isAuthenticated: boolean;
}</pre>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/web-design/interface/">TypeScriptのインターフェースとは？</a></p>



<h4 class="wp-block-heading">ステップ2: 初期状態を定義する</h4>



<p>次に、アプリケーションが最初に起動したときの状態（初期状態）を定義します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">const initialState: AuthState = {
  user: null,
  isAuthenticated: false
};</pre>



<h4 class="wp-block-heading">ステップ3: リデューサー関数を作成する</h4>



<p>リデューサー関数を作成し、アクションタイプに応じて状態を更新するロジックを書きます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">function authReducer(state: AuthState = initialState, action: Action): AuthState {
  switch (action.type) {
    case '[Auth] Login Success':
      return {
        ...state,
        user: action.payload.user,
        isAuthenticated: true
      };
    // 他のアクションタイプに対する処理
    default:
      return state;
  }
}</pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>この例では、<code><span class="blue">[Auth] Login Success</span></code>アクションが発生した場合に、ユーザー情報を更新し、<code><span class="blue">isAuthenticated</span></code>を<code><span class="blue">true</span></code>に設定しています。</p>
</div></div>



<p>先ほど定義したアクションファイルと見比べてみましょう。以下で定義したアクションと、今回定義したリデューサーがどのように対応しているか？にポイントを置きながら。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import { createAction, props } from '@ngrx/store';

// ユーザーログインのアクション定義
export const loginStart = createAction(
  '[Auth] Login Start',
  props&lt;{ username: string; password: string }>()
);

// ログイン成功時のアクション定義
export const loginSuccess = createAction(
  '[Auth] Login Success',
  props&lt;{ userId: string; token: string }>()
);

// ログイン失敗時のアクション定義
export const loginFailure = createAction(
  '[Auth] Login Failure',
  props&lt;{ error: string }>()
);</pre>



<h4 class="wp-block-heading">ステップ4: ストアへのリデューサーの登録</h4>



<p>リデューサーが準備できたら、アプリケーションの状態管理のためにNgRxストアに登録します。これは通常、アプリケーションのルートモジュール（例：<code><span class="blue">AppModule</span></code>）で行います。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import { StoreModule } from '@ngrx/store';
import { authReducer } from './auth.reducer';

@NgModule({
  imports: [
    StoreModule.forRoot({ auth: authReducer }),
    // 他のモジュールのインポート
  ],
  // その他のNgModuleメタデータ
})
export class AppModule {}</pre>



<p>このステップを通じて、アクションがディスパッチされたときにリデューサーが呼び出され、アプリケーションの状態が適切に更新されるようになります。コンポーネントやサービスからは、アクションをディスパッチすることで、リデューサーによる状態の変更を間接的に行うことができます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>リデューサーの作成方法/細かい構文ルールは以下でも解説しております。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">

<a href="https://it-biz.online/web-design/ngrx-createreducer/" title="【Angular/NgRx】createReducer の使い方/コツを１分で" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-biz.online/wp-content/uploads/2024/03/image-29-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-biz.online/wp-content/uploads/2024/03/image-29-320x180.png 320w, https://it-biz.online/wp-content/uploads/2024/03/image-29-240x135.png 240w, https://it-biz.online/wp-content/uploads/2024/03/image-29-640x360.png 640w" sizes="(max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【Angular/NgRx】createReducer の使い方/コツを１分で</div><div class="blogcard-snippet internal-blogcard-snippet">アプリケーションの状態管理において中心的な役割を果たすリデューサーの概念と、NgRxのcreateReducerを用いたリデューサーの簡単で効率的な作成方法を初心者向けに解説します。具体的なサンプルコード付きで、リデューサーの基礎から学べます。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-biz.online" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-biz.online</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.03.27</div></div></div></div></a>
</div></figure>
</div></div>



<h3 class="wp-block-heading"><span id="toc7">Effects（エフェクト）の実装</span></h3>



<p><strong>エフェクト</strong>は、アプリケーションの外部とのやりとり（例えば、データベースへの問い合わせや<a href="https://it-biz.online/it-skills/web_api/">外部API</a>の呼び出し）を管理するための仕組みです。エフェクトを使うことで、ユーザーの操作やシステムのイベントが発生したときに、それに応じて必要な副作用（外部との通信など）を実行し、その結果を元にアプリケーションの状態を更新します。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>アクションが「何かをしてほしい」という要求であると考えると、エフェクトはその要求に対して「では、これをしましょう」と応答する役割を持ちます。その結果を元にまた別のアクションを起こして、アプリケーションに知らせるのがエフェクトです。</p>
</div></div>



<h4 class="wp-block-heading">ステップ 4.1: エフェクト用のモジュールをインストール</h4>



<p>まず、NgRxエフェクトを使用するために必要なモジュールをインストールします。yarnを使用して、プロジェクトに<code><span class="blue">@ngrx/effects</span></code>を追加します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">yarn add @ngrx/effects</pre>



<h4 class="wp-block-heading">ステップ 4.2: エフェクトクラスを作成</h4>



<p>エフェクトクラスを作成します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// auth.effects.ts
import { Injectable } from '@angular/core';
import { Actions, ofType, createEffect } from '@ngrx/effects';
import { of } from 'rxjs';
import { catchError, map, mergeMap } from 'rxjs/operators';
import { AuthService } from '../services/auth.service';
import * as AuthActions from './auth.actions';

@Injectable()
export class AuthEffects {
  constructor(
    private actions$: Actions,
    private authService: AuthService
  ) {}
}</pre>



<h4 class="wp-block-heading">ステップ3: エフェクトを定義</h4>



<p>ログインアクションをリッスン（＝監視）し、成功または失敗の結果をもとに新しいアクションをディスパッチするエフェクトを定義します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">login$ = createEffect(() =>
  this.actions$.pipe(
    ofType(AuthActions.loginStart),
    mergeMap(action =>
      this.authService.login(action.username, action.password).pipe(
        map(user => AuthActions.loginSuccess({ user })),
        catchError(error => of(AuthActions.loginFailure({ error })))
      )
    )
  )
);</pre>



<h4 class="wp-block-heading">ステップ4: AppModuleにエフェクトを登録</h4>



<p>最後に、作成したエフェクトをアプリケーションに登録します。これには、<code><span class="blue">AppModule</span></code>に<code><span class="blue">EffectsModule.forRoot([])</span></code>を追加し、その配列内にエフェクトクラスを指定します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import { EffectsModule } from '@ngrx/effects';
import { AuthEffects } from './auth.effects';

@NgModule({
  imports: [
    // 他のモジュール
    EffectsModule.forRoot([AuthEffects]),
  ],
})
export class AppModule {}</pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>以上でエフェクトの実装は完了です。</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc8">セレクタの使用/コンポーネントとの統合</span></h2>



<p>ここからは、定義したアクションやストアなどを実際にアプリケーションの中で「用いるステップ」に関する解説となります。これらのステップは、NgRxを用いた状態管理の流れの中で、状態の読み取りや更新を行うための実践的な部分です。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>NgRxと<a href="https://it-biz.online/web-design/ng-generate-component/">コンポーネント</a>を統合する方法を解説して本ページの解説を終えます。</p>
</div></div>



<h3 class="wp-block-heading"><span id="toc9">Selector（セレクタ）の使用</span></h3>



<p>セレクタは、アプリケーションの状態（State）の中から、特定の情報を取り出すためのツールです。ある意味で「<strong>状態のクエリ</strong>」のようなものと考えることができます。例えば、アプリ全体の状態が本棚のようなものだとしたら、セレクタはその棚から読みたい本を選び出す役割を持っています。</p>



<h3 class="wp-block-heading"><span id="toc10">セレクタの作り方</span></h3>



<p>まず、アプリの状態（データ）の中から何を取り出したいのかを決めます。例えば、「ユーザーの名前」や「商品リスト」などです。次に、そのデータを取り出すためのセレクタ関数を作ります。NgRxには<code><span class="blue">createSelector</span></code>という便利な関数があり、これを使ってセレクタを作ることができます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import { createSelector } from '@ngrx/store';

// 全体の状態からユーザー部分の状態を取り出す
const selectUserState = (state) => state.user;

// ユーザー部分の状態から名前だけを取り出す
export const selectUserName = createSelector(
  selectUserState,
  (user) => user.name
);</pre>



<h3 class="wp-block-heading"><span id="toc11">セレクタの使い方</span></h3>



<p>セレクタができたら、コンポーネントでそれを使ってデータを取り出します。コンポーネントでは、<code><span class="blue">select</span></code>メソッドを通じてストアから特定の状態を選択するためにセレクタを使用します。これにより、必要なデータのみを効率的に取得できます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">count$ = this.store.select(selectFeatureCount);</pre>



<p>次に、コンポーネントからユーザーの操作やイベントに応じてアクションをストアにディスパッチします。これにより、アプリケーションの状態を更新する流れが始まります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">onLogin(username: string, password: string) {
  this.store.dispatch(login({ username, password }));
}</pre>



<p>最後に、コンポーネントでストアを利用するために、まずコンストラクタ内でストアを注入します。以下は、ストアと統合されたコンポーネントの例です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">@Component({
  selector: 'app-my-component',
  template: `
    &lt;div>Count: {{ count$ | async }}&lt;/div>
    &lt;button (click)="onLogin('username', 'password')">Login&lt;/button>
  `,
})
export class MyComponent {
  count$ = this.store.select(selectFeatureCount);

  constructor(private store: Store&lt;AppState>) {}

  onLogin(username: string, password: string) {
    this.store.dispatch(login({ username, password }));
  }
}</pre>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【Angular/NgRx】createReducer の使い方/コツを１分で</title>
		<link>https://it-biz.online/web-design/ngrx-createreducer/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Wed, 27 Mar 2024 02:58:46 +0000</pubDate>
				<category><![CDATA[TypeScript]]></category>
		<category><![CDATA[WEBデザイン]]></category>
		<category><![CDATA[Angular]]></category>
		<category><![CDATA[Web開発]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=9068</guid>

					<description><![CDATA[Reducer：リデューサーとは、AngularのNgRx:状態管理ライブラリにおける主要な部品の１つで、アプリの「状態」を変更するためのルールブックのようなものです。 ここで言う「状態」とは、アプリが覚えておくべき全て [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><strong>Reducer：リデューサー</strong>とは、<a href="https://it-biz.online/web-design/what-is-angular/">Angular</a>の<a href="https://it-biz.online/web-design/angular-ngrx/">NgRx:状態管理ライブラリ</a>における主要な部品の１つで、<strong>アプリの「状態」を変更するためのルールブックのようなもの</strong>です。</p>



<p>ここで言う「状態」とは、アプリが覚えておくべき全ての情報（例：ユーザー情報、ショッピングカートの内容など）のことで、アプリで何か操作をする（例：ボタンをクリックする、何かを追加する等）とき、その操作に応じて状態を「どのように変えるか」をリデューサーが決めます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p><strong>Reducer：リデューサー</strong>をもっとざっくりと説明すると「このアクションが起こったら、こんなふうに状態を変えてね」というルールを作るためのツールのようなものです。</p>
</div></div>



<p>このページでは、NgRxライブラリの「リデューサー」に焦点を当て、<span class="blue">createReducer</span>関数の使い方を分かりやすく解説します。</p>



<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="713" height="375" src="https://it-biz.online/wp-content/uploads/2024/03/image-28.png" alt="Angular NgRX" class="wp-image-9063" style="width:713px;height:auto" srcset="https://it-biz.online/wp-content/uploads/2024/03/image-28.png 713w, https://it-biz.online/wp-content/uploads/2024/03/image-28-500x263.png 500w, https://it-biz.online/wp-content/uploads/2024/03/image-28-300x158.png 300w" sizes="(max-width: 713px) 100vw, 713px" /><figcaption class="wp-element-caption">図1：Angular/NgRxライブラリの概要図</figcaption></figure>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-20" checked><label class="toc-title" for="toc-checkbox-20">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">createReducer</a><ol><li><a href="#toc2" tabindex="0">createReducerの例</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">createReducer</span></h2>



<p><code><span class="blue">createReducer</span></code>は、リデューサーを作るための便利なツールです。このツールを使って、アプリの状態をどのように更新するか、というルールを設定することができます。</p>



<p class="has-text-align-center"><span class="badge-green">ポイント</span>　<code><span class="blue">createReducer</span></code> でリデューサーを作るときのステップ</p>



<ol class="wp-block-list">
<li class="is-style-bottom-margin-1em has-bottom-margin"><strong>初期状態を決める</strong>
<ul class="wp-block-list">
<li class="is-style-bottom-margin-1em has-bottom-margin">最初に、この状態が持つ情報が何もないとき（つまり、アプリが起動したてのとき）は、どんな値になっているかを決めます。これが「初期状態」。</li>
</ul>
</li>



<li><strong>アクションに応じて状態を変えるルールを書く</strong>
<ul class="wp-block-list">
<li>次に、「もしこのアクションが起きたら、状態をこう変更して」というルールを記述。例えば、商品をカートに追加するアクションがあったら、カートの状態にその商品を追加する、というようなルールです。</li>
</ul>
</li>
</ol>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>具体的な構文ルールは以下の通り。</p>
</div></div>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">createReducer(
  initialState, // 1. 初期状態

  on(actionOne, (state, action) => { 
    // 2. アクション1が起きたときの新しい状態
  }),

  on(actionTwo, (state, action) => {
    // 3. アクション2が起きたときの新しい状態
  }),
  // ここに必要なだけアクションを追加できる
);</pre>



<ul class="wp-block-list">
<li><code><span class="blue">initialState</span></code>：これが状態のスタートラインです。アプリが始まったときのデフォルトの状態。</li>



<li><code><span class="blue">on(action, (state, action) =&gt; {})</span></code>：もし<code><span class="blue">action</span></code>が起きたら、どう状態を変えるかを定義します。<code>state</code>は変更前の状態、<code>action</code>はそのアクションに関連する情報を持っています。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc2">createReducerの例</span></h3>



<p>以下の例では、カウンターアプリの状態を管理するリデューサーを<code><span class="blue">createReducer</span></code>で作成しています。<code><span class="green">increment</span></code>アクションが発生したらカウントを1増やし、<code><span class="green">decrement</span></code>アクションが発生したら1減らす、というシンプルなルールを設定しています。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// createReducer関数,on関数を利用するために必要
import { createReducer, on } from '@ngrx/store';
// リデューサーが対応するアクションを識別できるようにアクション定義のインポートが必要
import { increment, decrement } from './counter.actions';


// 初期状態の設定
export const initialState = 0;

// リデューサーの定義
export const counterReducer = createReducer(
  initialState,
  on(increment, state => state + 1),
  on(decrement, state => state - 1)
);</pre>



<p><code><span class="green">increment</span></code>や<code><span class="green">decrement</span></code>というアクションは、<code><span class="blue">actions.ts</span></code>ファイル内で宣言されているものです。アクションは、アプリケーション内で起こるイベントを表し、そのイベントが発生したときにリデューサーによって状態がどのように更新されるべきかを伝える役割を持っています。</p>



<p>以下で定義した<code><span class="green">increment</span></code>や<code><span class="green">decrement</span></code>というアクションを、reducers.ts 内で参照するような形です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import { createAction } from '@ngrx/store';

// カウンターを1増やすアクション
export const increment = createAction('[Counter Component] Increment');

// カウンターを1減らすアクション
export const decrement = createAction('[Counter Component] Decrement');</pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>// リデューサーの定義<br>export const counterReducer = createReducer(<br>initialState,<br>on(<span class="green">increment</span>, state =&gt; state + 1),<br>on(<span class="green">decrement</span>, state =&gt; state - 1)<br>);</p>
</div></div>



<p><code><span class="blue">state => state + 1</span></code>という記述は、リデューサー関数内での状態の更新方法を示しています。ここでの<code><span class="blue">state</span></code>は、アプリケーションの現在の状態（この場合は、数値）を指します。この式は「現在の状態（<code>state</code>）に1を足した新しい状態を返す」という意味になります。</p>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/web-design/arrow-function/">JavaScript：アロー関数（=&gt;）</a></p>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<p class="has-text-align-center"><span class="badge-green">まとめ１</span>　リデューサーとは何か</p>



<ul class="wp-block-list">
<li>リデューサーは、アプリケーションの状態を変更するための純粋関数。</li>



<li>アクションが発生したとき、そのアクションに応じてアプリケーションの状態をどのように変更するかを定義。</li>
</ul>



<p class="has-text-align-center"><span class="badge-green">まとめ２</span>　createReducerの使い方</p>



<ol class="wp-block-list">
<li><strong>初期状態の定義</strong>：アプリケーションの該当部分のスタート時点での状態を定義す。</li>



<li><strong>アクションハンドラの設定</strong>：特定のアクションが発生したときに状態をどう変更するかのロジックを定義。</li>



<li><strong>リデューサーの作成</strong>：<code>createReducer</code>関数を使用して、上記の初期状態とアクションハンドラからリデューサーを作成する。</li>
</ol>



<pre class="EnlighterJSRAW" data-enlighter-language="typescript" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import { createReducer, on } from '@ngrx/store';
import { increment, decrement } from './counter.actions';

// 初期状態
export const initialState = 0;

// リデューサーの作成
export const counterReducer = createReducer(
  initialState,
  on(increment, state => state + 1),
  on(decrement, state => state - 1)
);</pre>
</div>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
