監視可能な配列の長さを確認する方法


108

私のAngular 2コンポーネントには、Observable配列があります

list$: Observable<any[]>;

私のテンプレートには

<div *ngIf="list$.length==0">No records found.</div>

<div *ngIf="list$.length>0">
    <ul>
        <li *ngFor="let item of list$ | async">item.name</li>
    </ul>
</div>

しかし、list $ .lengthは、Observable配列の場合には機能しません。

更新:

それはそのようで長さは?。|(非同期リスト$を):私たちの長さを与えますが、コードの下に、まだ動作しません。

<div>
    Length: {{(list$ | async)?.length}}
    <div *ngIf="(list$ | async)?.length>0">
        <ul>
            <li *ngFor="let item of (list$ | async)">
                {{item.firstName}}
            </li>
        </ul>
    </div>
</div>

誰でも私がObservable配列の長さをチェックする方法を教えてください。


回答:


178

| asyncパイプを使用できます:

<div *ngIf="(list$ | async)?.length==0">No records found.</div>

更新-Angularバージョン6:

CSSスケルトンをロードする場合は、これを使用できます。配列に項目がない場合は、CSSテンプレートが表示されます。データがある場合は、に記入してくださいngFor

<ul *ngIf="(list$| async)?.length > 0; else loading">
   <li *ngFor="let listItem of list$| async">
      {{ listItem.text }}
   </li>
</ul>

<ng-template #loading>
  <p>Shows when no data, waiting for Api</p>
  <loading-component></loading-component>
</ng-template>

4
私もそれを試しましたが、「TypeError:nullのプロパティ 'length'を読み取れません」というエラーが発生します
Naveed Ahmed

3
あなたが提供した情報から知るのは難しい。試してみてください<div *ngIf="(list$ | async)?.length==0">No records found.</div>(追加?
ギュンターZöchbauer

6
これを試してみたところ、<div * ngIf = "(list $ | async)?. length == 0">レコードが見つかりません。</ div>
Naveed Ahmed

3
Angular2が最初にビューをレンダリングしようとした後にのみ設定さ?れるため、追加が必要です。残りの部分が(Elvisまたは安全なナビゲーション演算子)になるまで、残りの部分式が評価されるのを防ぎます。list$??!= null
ギュンターZöchbauer

1
@GünterZöchbauer最初のasyncパイプはデータを解決するため、asyncループの次のパイプには何も表示されません。または*ngIf、追加のスコープを作成して、機能しない場合があります。わかりにくい。しかし、私のループはifでラップされていますが、データは表示されません。それ自体がtrue正しく評価される場合。
ユージーン

31

.tsファイルのソリューション:

     this.list.subscribe(result => {console.log(result.length)});

その後すぐに退会する必要はありませんか?
Peter

onDestroyコンポーネントのオブザーバブルの登録を解除することをお
勧め

16

Angular 4+の場合、これを試してください

<div *ngIf="list$ | async;let list">
    Length: {{list.length}}
    <div *ngIf="list.length>0">
        <ul>
            <li *ngFor="let item of list">
                {{item.firstName}}
            </li>
        </ul>
    </div>
</div>

7

この答えは正しいですが

<div *ngIf="(list$ | async)?.length === 0">No records found.</div>

httpクライアントを使用してバックエンドを呼び出す場合(ほとんどの場合、そうします)、リストが複数ある場合、APIの呼び出しが重複することに注意してください$ | 非同期。これは、非同期パイプは、list $オブザーバブルの新しいサブスクライバーを作成します。


4

これは私のために働いたものです-

*ngIf="!photos || photos?.length===0"

httpClient asyncからデータを取得しています。

ここにある他のすべてのオプションは私にとってはうまくいきませんでした。特にセクシーな(list $ | async)パイプ。

バサ


2

ここでのアプローチには、別の大きな問題があります。テンプレートで非同期パイプを何度も利用することで、実際には、単一のObservableへのその多くのサブスクリプションを開始します。

KAMRUL HASAN SHAHEDには上記の正しいアプローチがあります。非同期パイプを一度使用してから、子ノードで利用できる結果のエイリアスを提供します。


1

同様に短縮することができます:

<div *ngIf="!(list$ | async)?.length">No records found.</div>

括弧の前に感嘆符を使用してください。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.