วิธีตรวจสอบความยาวของอาร์เรย์ที่สังเกตได้


109

ในองค์ประกอบ Angular 2 ของฉันฉันมีอาร์เรย์ที่สังเกตได้

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 array

อัปเดต:

ดูเหมือนว่า(list $ | async) ?. lengthทำให้เรามีความยาว แต่โค้ดด้านล่างยังใช้ไม่ได้:

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

ใครช่วยแนะนำวิธีตรวจสอบความยาวของอาร์เรย์ที่สังเกตได้


คำตอบ:


179

คุณสามารถใช้| asyncท่อ:

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

อัปเดต - Angular เวอร์ชัน 6:

หากคุณกำลังโหลด css Skeleton คุณสามารถใช้สิ่งนี้ได้ หากอาร์เรย์ไม่มีรายการจะแสดงเทมเพลต 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: Cannot read property 'length' of null"
Naveed Ahmed

3
ยากที่จะทราบจากข้อมูลที่คุณให้มา ลอง<div *ngIf="(list$ | async)?.length==0">No records found.</div>(เพิ่ม?)
GünterZöchbauer

6
ฉันลองแล้วมันใช้งานได้ <div * ngIf = "(list $ | async) ?. length == 0"> ไม่พบบันทึก </div>
Naveed Ahmed

3
?จำเป็นต้องมีเพิ่มเติมเนื่องจากlist$ถูกตั้งค่าหลังจาก Angular2 พยายามแสดงมุมมองในครั้งแรกเท่านั้น ?ป้องกันไม่ให้ส่วนที่เหลือของนิพจน์ย่อยถูกประเมินจนกว่าส่วนที่เหลือ?จะกลายเป็น!= null(Elvis หรือตัวดำเนินการนำทางที่ปลอดภัย)
GünterZöchbauer

1
@ GünterZöchbauerสำหรับฉันasyncท่อแรกนั้นแก้ไขข้อมูลดังนั้นไพพ์ต่อไปของฉันasyncบนลูปจึงไม่แสดงอะไรเลย หรืออาจ*ngIfสร้างขอบเขตเพิ่มเติมดังนั้นจึงไม่ทำงาน ยากที่จะบอก แต่ในขณะที่ลูปของฉันถูกพันอยู่ภายใน if มันไม่แสดงข้อมูลใด ๆ ถ้าตัวเองประเมินtrueถูกต้อง
Eugene

32

โซลูชันสำหรับ. ts-Files:

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

ไม่จำเป็นต้องยกเลิกการสมัครทันทีในภายหลังใช่หรือไม่?
ปีเตอร์

จะเป็นการดีกว่าที่จะยกเลิกการเป็นสมาชิกจากสิ่งที่สังเกตได้ในonDestroyองค์ประกอบ
ThPadelis


7

ในขณะที่คำตอบนี้ถูกต้อง

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

โปรดทราบว่าหากคุณใช้ไคลเอนต์ http เพื่อเรียกแบ็กเอนด์ (ในกรณีส่วนใหญ่คุณทำ) คุณจะได้รับการเรียกซ้ำไปยัง API ของคุณหากคุณมีมากกว่าหนึ่งรายการ $ | async นี่เป็นเพราะแต่ละ | ท่อ async จะสร้างสมาชิกใหม่ในรายการของคุณ $ สังเกตได้


4

นี่คือสิ่งที่ได้ผลสำหรับฉัน -

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

ฉันได้รับข้อมูลจาก httpClient async

ตัวเลือกอื่น ๆ ทั้งหมดที่นี่ไม่ได้ผลสำหรับฉันซึ่งน่าผิดหวัง โดยเฉพาะท่อ sexy (list $ | async).

บาซา ..


2

แนวทางของคุณมีปัญหาสำคัญอีกประการหนึ่ง: โดยการใช้ประโยชน์จากท่อ async ซ้ำแล้วซ้ำอีกในเทมเพลตของคุณคุณกำลังเริ่มต้นการสมัครสมาชิกจำนวนมากสำหรับ Observable เดียว

KAMRUL HASAN SHAHED มีแนวทางที่ถูกต้องข้างต้น: ใช้ async ไปป์หนึ่งครั้งจากนั้นระบุนามแฝงสำหรับผลลัพธ์ที่คุณสามารถใช้ประโยชน์จากโหนดลูกได้


1

สามารถย่อได้เช่นกัน:

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

เพียงใช้เครื่องหมายตกใจก่อนวงเล็บ


-3

ไอออนิก 4

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

มันใช้งานได้เมื่อฉันลบ$เครื่องหมายออก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.