詳細ガイド
テンプレート構文

バインディングを理解する

Angularのテンプレートでは、バインディングによりテンプレートから作成されたUIの一部(DOM要素、ディレクティブ、またはコンポーネント)とモデル(テンプレートが属するコンポーネントインスタンス)間にライブ接続が確立されます。この接続はビューをモデルと同期させたり、ビューでイベントやユーザーアクションが発生したときにモデルに通知したり、その両方を行うために使用できます。Angularの 変更検知 アルゴリズムは、ビューとモデルを同期させる役割を担います。

バインディングの例には、次のようなものがあります。

  • テキスト補間
  • プロパティバインディング
  • イベントバインディング
  • 双方向バインディング

バインディングには常に、ターゲット(バインドされた値を受け取るもの)と、テンプレート式(モデルから値を生成するもの)の2つの部分があります。

構文

テンプレート式はJavaScript式に似ています。 多くのJavaScript式は有効なテンプレート式ですが、以下の例外があります。

副作用を持つ、または副作用を促進するJavaScript式は使用できません。具体的には、以下を含みます。

  • 代入 (=, +=, -=, ...)
  • new, typeof, または instanceof などの演算子
  • ; または , を使用した式チェーン
  • インクリメントおよびデクリメント演算子 ++ および --
  • ES2015+ の演算子のいくつか

JavaScript構文からのその他の顕著な違いには、次のようなものがあります。

  • |& などのビット単位の演算子はサポートされていません。

式のコンテキスト

補間された式には、式が属するアプリケーションの特定の部分であるコンテキストがあります。通常、このコンテキストはコンポーネントインスタンスです。

次のスニペットでは、recommended 式と itemImageUrl2 式は、AppComponent のプロパティを参照しています。

src/app/app.component.html

      
<div>
<h1>Interpolation and Template Expressions</h1>
<hr />
<div>
<h2>Interpolation</h2>
<h3>Current customer: {{ currentCustomer }}</h3>
<p>{{ title }}</p>
<div><img alt="item" src="{{ itemImageUrl }}"></div>
<h3>Evaluating template expressions </h3>
<h4>Simple evaluation (to a string):</h4>
<!-- "The sum of 1 + 1 is 2" -->
<p>The sum of 1 + 1 is {{ 1 + 1 }}.</p>
<h4>Evaluates using a method (also evaluates to a string):</h4>
<!-- "The sum of 1 + 1 is not 4" -->
<p>The sum of 1 + 1 is not {{ 1 + 1 + getVal() }}.</p>
</div>
<hr />
<h2>Expression Context</h2>
<div>
<h3>Component context, properties of app.component.ts:</h3>
<h4>{{ recommended }}</h4>
<img alt="item 2" [src]="itemImageUrl2">
</div>
<div>
<h4>Template context, template input variables (let customer):</h4>
<ul>
@for (customer of customers; track customer) {
<li>{{ customer.name }}</li>
}
</ul>
</div>
<div (keyup)="0">
<h4>Template context: template reference variables (#customerInput):</h4>
<label for="customer-input">Type something:
<input id="customer-input" #customerInput>{{ customerInput.value }}
</label>
</div>
</div>

式は、テンプレート入力変数テンプレート参照変数 などの、テンプレート のコンテキストのプロパティも参照できます。

次の例では、customer のテンプレート入力変数を使用しています。

src/app/app.component.html (template input variable)

      
<div>
<h1>Interpolation and Template Expressions</h1>
<hr />
<div>
<h2>Interpolation</h2>
<h3>Current customer: {{ currentCustomer }}</h3>
<p>{{ title }}</p>
<div><img alt="item" src="{{ itemImageUrl }}"></div>
<h3>Evaluating template expressions </h3>
<h4>Simple evaluation (to a string):</h4>
<!-- "The sum of 1 + 1 is 2" -->
<p>The sum of 1 + 1 is {{ 1 + 1 }}.</p>
<h4>Evaluates using a method (also evaluates to a string):</h4>
<!-- "The sum of 1 + 1 is not 4" -->
<p>The sum of 1 + 1 is not {{ 1 + 1 + getVal() }}.</p>
</div>
<hr />
<h2>Expression Context</h2>
<div>
<h3>Component context, properties of app.component.ts:</h3>
<h4>{{ recommended }}</h4>
<img alt="item 2" [src]="itemImageUrl2">
</div>
<div>
<h4>Template context, template input variables (let customer):</h4>
<ul>
@for (customer of customers; track customer) {
<li>{{ customer.name }}</li>
}
</ul>
</div>
<div (keyup)="0">
<h4>Template context: template reference variables (#customerInput):</h4>
<label for="customer-input">Type something:
<input id="customer-input" #customerInput>{{ customerInput.value }}
</label>
</div>
</div>

次の例では、#customerInput のテンプレート参照変数を使用しています。

src/app/app.component.html (template reference variable)

      
<div>
<h1>Interpolation and Template Expressions</h1>
<hr />
<div>
<h2>Interpolation</h2>
<h3>Current customer: {{ currentCustomer }}</h3>
<p>{{ title }}</p>
<div><img alt="item" src="{{ itemImageUrl }}"></div>
<h3>Evaluating template expressions </h3>
<h4>Simple evaluation (to a string):</h4>
<!-- "The sum of 1 + 1 is 2" -->
<p>The sum of 1 + 1 is {{ 1 + 1 }}.</p>
<h4>Evaluates using a method (also evaluates to a string):</h4>
<!-- "The sum of 1 + 1 is not 4" -->
<p>The sum of 1 + 1 is not {{ 1 + 1 + getVal() }}.</p>
</div>
<hr />
<h2>Expression Context</h2>
<div>
<h3>Component context, properties of app.component.ts:</h3>
<h4>{{ recommended }}</h4>
<img alt="item 2" [src]="itemImageUrl2">
</div>
<div>
<h4>Template context, template input variables (let customer):</h4>
<ul>
@for (customer of customers; track customer) {
<li>{{ customer.name }}</li>
}
</ul>
</div>
<div (keyup)="0">
<h4>Template context: template reference variables (#customerInput):</h4>
<label for="customer-input">Type something:
<input id="customer-input" #customerInput>{{ customerInput.value }}
</label>
</div>
</div>

HELPFUL: テンプレート式は、undefined を除いて、グローバル名前空間内のものは何も参照できません。 windowdocument は参照できません。また、console.log()Math.max() を呼び出すことができず、式のコンテキストのメンバーの参照に限定されています。

名前衝突の防止

式が評価されるコンテキストは、テンプレート変数、ディレクティブのコンテキストオブジェクト(存在する場合)、およびコンポーネントのメンバーの結合です。 複数の名前空間に属する名前を参照する場合、Angularは次の優先順位ロジックを適用してコンテキストを決定します。

  1. テンプレート変数名
  2. ディレクティブのコンテキスト内の名前
  3. コンポーネントのメンバー名

変数が別のコンテキストの変数を隠すことを防ぐために、変数名を一意に保ちます。 次の例では、AppComponent テンプレートは、customer のPadmaに挨拶します。

@for は、customers 配列内の各 customer をリスト表示します。

src/app/app.component.ts

      
import {Component} from '@angular/core';
import {NgFor} from '@angular/common';
@Component({
standalone: true,
template: `
<div>
<!-- Hello, Padma -->
<h1>Hello, {{customer}}</h1>
<ul>
<!-- Ebony and Chiho in a list-->
@for (customer of customers; track customer) {
<li>{{ customer.value }}</li>
}
</ul>
</div>
`,
})
export class AppComponent {
customers = [{value: 'Ebony'}, {value: 'Chiho'}];
customer = 'Padma';
}

@for 内の customer は、@for によって定義された暗黙の <ng-template> のコンテキストにあります。これは、customers 配列内の各 customer を参照し、"Ebony" と "Chiho" を表示します。"Padma" は、その配列内に存在しないため表示されません。

一方、<h1> は、コンポーネントクラスの customer プロパティの値にバインドされた "Padma" を表示します。

式のベストプラクティス

テンプレート式を使用する際には、次のベストプラクティスに従ってください。

  • 短い式を使用する

可能な限り、プロパティ名やメソッド呼び出しを使用します。アプリケーションロジックとビジネスロジックは、開発とテストが可能なコンポーネントに保持します。

  • 迅速な実行

Angularは、変更検知サイクルのたびにテンプレート式を実行します。Promise解決、HTTP結果、タイマーイベント、キー押下、マウス移動など、多くの非同期アクティビティが変更検知サイクルをトリガーします。

特に低速なデバイスでは、ユーザー体験をできるだけ効率的にするために、式は迅速に終了する必要があります。計算に多くのリソースを必要とする場合は、値をキャッシュすることを検討してください。

可視的な副作用なし

Angularの単方向データフローモデルに従って、テンプレート式は、ターゲットプロパティの値以外、アプリケーションの状態を変更すべきではありません。コンポーネントの値を読み取ることは、他の表示される値を変更すべきではありません。ビューは、1回のレンダリングパス全体で安定している必要があります。

冪等 な式は副作用がなく、Angularの変更検知のパフォーマンスを向上させます。Angularの用語では、冪等な式は、依存する値のいずれかが変更されるまでは、常に まったく同じもの を返します。

依存する値は、イベントループの1回のターン中に変更されるべきではありません。べき等な式が文字列または数値を返す場合、それを連続して2回呼び出した場合、同じ文字列または数値を返します。式がオブジェクト(array を含む)を返す場合、それを連続して2回呼び出した場合、同じオブジェクト 参照 を返します。

次へ