[解決済み】*ngIfと*ngForが同じ要素にあるとエラーになる件
2022-04-14 15:48:53
質問
Angularの
*ngFor
と
*ngIf
を同じ要素で使用することができます。
のコレクションをループさせようとすると
*ngFor
として表示されます。
null
その結果、テンプレート内でそのプロパティにアクセスしようとすると失敗します。
@Component({
selector: 'shell',
template: `
<h3>Shell</h3><button (click)="toggle()">Toggle!</button>
<div *ngIf="show" *ngFor="let thing of stuff">
{{log(thing)}}
<span>{{thing.name}}</span>
</div>
`
})
export class ShellComponent implements OnInit {
public stuff:any[] = [];
public show:boolean = false;
constructor() {}
ngOnInit() {
this.stuff = [
{ name: 'abc', id: 1 },
{ name: 'huo', id: 2 },
{ name: 'bar', id: 3 },
{ name: 'foo', id: 4 },
{ name: 'thing', id: 5 },
{ name: 'other', id: 6 },
]
}
toggle() {
this.show = !this.show;
}
log(thing) {
console.log(thing);
}
}
を移動させることが簡単な解決策であることは知っています。
*ngIf
を一段上に上げるが、リスト項目をループするようなシナリオでは
ul
の場合、結局は空の
li
コレクションが空であれば、私の
li
を冗長なコンテナ要素で包む。
これでの例 プルンクル .
コンソールエラーに注意してください。
EXCEPTION: TypeError: Cannot read property 'name' of null in [{{thing.name}} in ShellComponent@5:12]
私のやり方が悪いのか、それともバグなのか?
解決方法を教えてください。
Angular v2は、同じ要素に複数の構造ディレクティブをサポートしません。
回避策として
<ng-container>
要素を使用すると、各構造ディレクティブに別々の要素を使用することができますが
DOMにスタンプされない
.
<ng-container *ngIf="show">
<div *ngFor="let thing of stuff">
{{log(thing)}}
<span>{{thing.name}}</span>
</div>
</ng-container>
<ng-template>
(
<template>
Angular v4以前)でも同じことができますが、構文が異なるので混乱しますし、もはや推奨されません。
<ng-template [ngIf]="show">
<div *ngFor="let thing of stuff">
{{log(thing)}}
<span>{{thing.name}}</span>
</div>
</ng-template>
関連
-
[解決済み】「ルーターリンク」は既知のプロパティではないため、バインドできない
-
[解決済み] angularでpreflightのレスポンスがHTTP okステータスにならない
-
[解決済み] 未定義のプロパティ 'filter' を読み取ることができません。
-
[解決済み] NgModule が見つかりませんでした。NgModule でのインポートをスキップするには skip-import オプションを使用します。
-
[解決済み] Electron - ローカルリソースのロードが許可されていません
-
[解決済み] ag-gridで「表示する行がありません」テキストをプログラムで変更するにはどうすればよいですか?
-
[解決済み] パーサエラーです。式が期待される場所で補間({{}})を得た
-
[解決済み] Angular InjectionTokenが「No provider for InjectionToken」をスローします。
-
[解決済み] AngularでKendo Tabstripのタブを閉じるボタンを実装する方法
-
[解決済み] オブジェクトのキーと値に*ngForでアクセスする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] node_modules が空になったので、`npm install`を実行する必要があるかもしれない。
-
[解決済み】本番モードを有効にするには?
-
[解決済み] NullInjectorError: MatDialogRef 用のプロバイダがありません
-
[解決済み] NgModule が見つかりませんでした。NgModule でのインポートをスキップするには skip-import オプションを使用します。
-
[解決済み] updateValueAndValidityとは?
-
[解決済み] typescriptを使用して、同じhtml DOM要素で「シングルクリック」と「ダブルクリック」を処理する方法:Angular 2または4?
-
[解決済み] "エラーです。オーバーレイのプロバイダがありません!"
-
[解決済み] Angular2 Selectorが、ネストしたComponentのどの要素にもマッチしない。
-
[解決済み] Angularアプリのシンタックスエラー。予期しないトークン <
-
[解決済み] Angular 6でmouseoverとmouseoutを使用する方法