*ngFor
またはCommonModule
のインポート忘れによるエラーの解決
エラーメッセージが表示される場合
Angularで以下のエラーが発生した場合:
The
*ngFor
directive was used in the template, but neither theNgFor
directive nor theCommonModule
was imported.
これはAngular 17以降のスタンドアロンコンポーネントを使用する環境で*ngFor
ディレクティブを利用する際、必要なモジュールのインポートが不足していることを示します。
エラー発生の条件
このエラーが表示される典型的なシナリオ:
- Angular 17以上でスタンドアロンコンポーネントを使用している(デフォルト設定)
- テンプレート内で
*ngFor
ディレクティブを利用している - コンポーネントに
NgFor
ディレクティブまたはCommonModule
がインポートされていない
<!-- 以下のようなテンプレートでエラーが発生 -->
<ul>
<li *ngFor="let c of contacts">
{{c.id}} - {{c.name}}
</li>
</ul>
解決方法 1: NgFor
の直接インポート
スタンドアロンコンポーネントでは、使用するディレクティブを直接インポートする必要があります。
TypeScriptファイルでの修正手順:
import { Component } from '@angular/core';
import { NgFor } from '@angular/common'; // NgForを明示的にインポート
@Component({
selector: 'app-contacts',
standalone: true,
imports: [NgFor], // インポート配列に追加
templateUrl: './contacts.component.html',
styleUrl: './contacts.component.scss'
})
export class ContactsComponent {
contacts = [
{ id: 1, name: '田中 太郎' },
{ id: 2, name: '佐藤 花子' }
];
}
複数ディレクティブを使用する場合
*ngIf
など他のビルトインディレクティブも使用する場合は、代わりにCommonModule
全体をインポートすると効率的です:
import { CommonModule } from '@angular/common';
@Component({
standalone: true,
imports: [CommonModule], // 全汎用ディレクティブを一括インポート
// ...
})
解決方法 2: 新しい制御フロー構文への移行
Angular 17以降では、パフォーマンスと型安全性が向上した新しい制御フロー構文が推奨されています。
<ul>
@for (c of contacts; track c.id) {
<li>{{c.id}} - {{c.name}}</li>
}
</ul>
新しい構文の主な利点
track
による最適化:要素の一意な識別子を明示(例:track c.id
)- ランタイムパフォーマンス向上:従来の
*ngFor
より処理が効率化 - 型サポートの強化:TypeScriptの型チェックがテンプレート内で機能
マイグレーション時の注意
既存プロジェクトの場合は、Angular CLIで自動変換コマンドが利用可能:
ng generate @angular/core:control-flow
ただし、複雑なテンプレート構造では手動確認が推奨されます。
根本原因と予防策
エラーの本質的原因:
予防のベストプラクティス:
- Angular CLIの厳格モードを活用bash
ng new --strict
- IDE拡張機能の利用(開発中に未インポートディレクティブを検知)
- 新規コンポーネント作成時は、使用するディレクティブをインポート配列に確実に追加
推奨解決方法
新規プロジェクト開発時
→ 新しい制御フロー構文(@for)を積極採用
パフォーマンス・型安全性・可読性の改善が得られる既存プロジェクトの改修時
→CommonModule
のインポートで即時解決
既存コード構造を大きく変更せず対応可能
どちらの方法を選択する場合も、開発環境で厳密な型チェックを有効にし、類似エラーの早期検知を実現しましょう。