Cách kiểm tra độ dài của một mảng có thể quan sát


108

Trong thành phần Angular 2 của tôi, tôi có một mảng có thể quan sát

list$: Observable<any[]>;

Trong Mẫu của tôi, tôi có

<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>

Nhưng danh sách $ .length không hoạt động trong trường hợp mảng có thể quan sát được.

Cập nhật:

Có vẻ như (list $ | async) ?. length cho chúng ta độ dài nhưng đoạn mã dưới đây vẫn không hoạt động:

<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>

Mọi người có thể vui lòng hướng dẫn cách kiểm tra độ dài của mảng có thể quan sát được không.


Câu trả lời:


178

Bạn có thể sử dụng | asyncđường ống:

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

Cập nhật - Phiên bản Angular 6:

Nếu bạn đang tải lên một Skeleton css, bạn có thể sử dụng nó. Nếu mảng không có mục nào, nó sẽ hiển thị mẫu css. Nếu có dữ liệu thì hãy điền vào 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
Tôi cố gắng đó cũng nhưng nó mang lại báo lỗi "Lỗi Loại: Không thể đọc thuộc 'chiều dài' của null"
Naveed Ahmed

3
Khó biết từ thông tin bạn cung cấp. Hãy thử <div *ngIf="(list$ | async)?.length==0">No records found.</div>(đã thêm ?)
Günter Zöchbauer

6
Tôi đã thử điều này và nó hoạt động <div * ngIf = "(list $ | async) ?. length == 0"> Không tìm thấy bản ghi nào. </div>
Naveed Ahmed

3
Phần bổ sung ?là bắt buộc vì list$chỉ được đặt sau khi Angular2 cố gắng hiển thị chế độ xem lần đầu tiên. ?ngăn phần còn lại của biểu thức con được đánh giá cho đến khi phần bên trái của ?trở thành != null(Elvis hoặc toán tử điều hướng an toàn).
Günter Zöchbauer

1
@ GünterZöchbauer, đối với tôi, asyncđường dẫn đầu tiên giải quyết dữ liệu và do đó asyncđường dẫn tiếp theo trên vòng lặp của tôi không hiển thị bất kỳ thứ gì. Hoặc có thể *ngIftạo một phạm vi bổ sung và do đó nó không hoạt động. Khó nói. Nhưng trong khi vòng lặp của tôi được bao bọc bên trong if, nó không hiển thị bất kỳ dữ liệu nào. Nếu bản thân nó đánh giá trueđúng.
Eugene

31

Giải pháp cho .ts-Files:

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

không cần thiết phải hủy đăng ký ngay lập tức sau đó?
Peter

Nó tốt hơn để bỏ đăng ký từ quan sát trên onDestroythành phần
ThPadelis

16

Đối với Angular 4+, hãy thử cái này

<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

Trong khi câu trả lời này là đúng

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

Hãy nhớ rằng nếu bạn đang sử dụng ứng dụng khách http để gọi phần phụ trợ (trong hầu hết các trường hợp là như vậy), bạn sẽ nhận được các lệnh gọi trùng lặp đến API của mình nếu bạn có nhiều hơn một danh sách $ | không đồng bộ . Điều này là do mỗi | đường ống không đồng bộ sẽ tạo người đăng ký mới vào danh sách $ có thể quan sát được của bạn.


4

Đây là những gì làm việc cho tôi -

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

Tôi đang lấy dữ liệu của mình từ không đồng bộ httpClient.

Tất cả các tùy chọn khác ở đây không hoạt động đối với tôi, điều đó thật đáng thất vọng. Đặc biệt là đường ống sexy (list $ | async).

Cá ba sa ..


2

Cách tiếp cận của bạn ở đây có một vấn đề lớn khác: bằng cách tận dụng lặp đi lặp lại đường ống không đồng bộ trong mẫu của bạn, bạn thực sự đang bắt đầu có nhiều đăng ký cho một Observable duy nhất.

KAMRUL HASAN SHAHED có cách tiếp cận phù hợp ở trên: Sử dụng đường ống không đồng bộ một lần và sau đó cung cấp bí danh cho kết quả mà bạn có thể tận dụng trong các nút con.


1

Cũng có thể được rút ngắn:

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

Chỉ cần sử dụng dấu chấm than trước ngoặc đơn.


-3

ion 4

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

nó hoạt động khi tôi gỡ bỏ $dấu hiệu

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.