handlerbars.js ตรวจสอบว่ารายการว่างหรือไม่


122

มีวิธีในเทมเพลต Handlebars.js เพื่อตรวจสอบว่าคอลเล็กชันหรือรายการเป็นโมฆะหรือว่างเปล่าก่อนที่จะไปและวนซ้ำตามรายการ / คอลเลกชันหรือไม่

// if list is empty do some rendering ... otherwise do the normal
{{#list items}}

{{/list}}



{{#each items}}

{{/each}}

คำตอบ:


209

แท็ก "each" สามารถใช้ส่วน "else" ได้เช่นกัน ดังนั้นรูปแบบที่ง่ายที่สุดคือ:

{{#each items}}
// render item
{{else}}
// render empty
{{/each}}

1
เจ๋งดี แต่ไม่ตอบคำถาม หากคุณต้องการให้แท็กปิดทับ#eachเช่น<ul>แท็ก (มี<li>s อยู่ข้างใน) คุณไม่ต้องการให้สถานะว่างถูกห่อด้วย<ul>.
Leonardo Raele

236

หากคุณมีบางสิ่งที่คุณต้องการแสดงเพียงครั้งเดียวและเฉพาะในกรณีที่อาร์เรย์มีข้อมูลให้ใช้

{{#if items.length}}
    //Render
{{/if}}

.length จะส่งคืน 0 สำหรับอาร์เรย์ว่างดังนั้นเราจึงได้ค่าที่เป็นเท็จจริง


1
คำตอบทั้งสองถูกต้องและใช้ได้ผลและตอบคำถาม ซึ่งเป็นวิธีการแสดงบางสิ่งเมื่อไม่มีข้อมูลในอาร์เรย์ ไม่ใช่วิธีอื่น ๆ
Drejc

15
ไม่ฉันเห็นด้วยนี่คือคำตอบที่ถูกต้อง ไม่รวมห่วง
radtek

4
กรณีง่ายๆ: ฉันต้องการแสดง<ul>แท็กหนึ่งครั้งและ<li>แท็กสำหรับแต่ละรายการในรายการ หากรายการว่างเปล่าฉันไม่ต้องการ<ul>ให้แสดงผลและการแสดงผลอย่างอื่นเช่น<p>empty list<p>ข้างใน<ul>นั้นไม่สมเหตุสมผล
Fuad Saud

2
คำตอบนี้คือการใช้งานเฉพาะ แฮนด์เอกสารระบุว่า[]มีการประเมินว่าเป็นเท็จ คำตอบของ @Drejc คือคำตอบที่ถูกต้องตามข้อกำหนดของมือจับ
Stim

1
ขอบคุณเพื่อนนั่นเป็นวิธีที่ดีกว่า registerHelper
เดนมาร์ก

38

โอเคมันง่ายกว่าที่คิด:

{{#if items}}
// render items

{{#each items}}
// render item
{{/each}}

{{else}}
// render empty
{{/if}}

5
ถ้าitemsเป็นอาร์เรย์ว่าง (เช่นมีค่า[]) ก็จะสร้างค่าที่แท้จริง ในขณะที่items.lengthสร้างค่าเท็จสำหรับอาร์เรย์ว่าง ดู@ คำตอบดวน
gfullam

หึ ... 3 ปีผ่านไปแล้ว ... อาจเป็นไปได้ว่าการใช้งานเปลี่ยนไปหรือว่าฉันธรรมดาไม่มีอาร์เรย์ [] เลย เท่าที่ฉันจำได้มันได้ผลสำหรับฉัน
Drejc

13
คุณถูก. ฉัน preemptively แสดงความคิดเห็นขึ้นอยู่กับพฤติกรรมของพื้นเมือง JS ฯifแต่เอกสาร Handlebarsมีความชัดเจนมาก: 'ถ้าของผลตอบแทนการโต้แย้งfalse, undefined, null, "", 0หรือ[]แฮนด์จะไม่ทำให้บล็อก.' ฉันควรตรวจสอบเอกสารก่อน
gfullam

8

หากคุณต้องการตรวจสอบว่าคอลเลกชัน (เคอร์เซอร์) ว่างเปล่าหรือไม่คำตอบก่อนหน้านี้จะไม่มีประโยชน์คุณต้องใช้count()วิธีการ:

{{#if items.count}}
    <p>There is {{items.count}} item(s).</p>
{{else}}
    <p>There is nothing</p>
{{/if}}

2
@BasicWolf ไม่นับใช้งานได้กับเคอร์เซอร์หากคุณมีอาร์เรย์ให้ใช้ความยาวแทน
Karl.S

วิธีนี้ใช้งานได้ดีในการตรวจสอบระหว่างอาร์เรย์และอ็อบเจ็กต์และจัดการกับอาร์เรย์ที่แตกต่างกัน
Ryan Walton

2

สำหรับใครก็ตามที่ต้องการใช้ {{#each}} ที่ด้านบนของ {{#if}} (เช่น if loop ภายใน a for loop) พวกเขามีรายการอาร์เรย์ที่แตกต่างกันสามรายการหรือไม่

การใช้การค้นหาภายในคำสั่ง if ช่วยแก้ปัญหาให้ฉันได้ เนื่องจากคำตอบข้างต้นไม่สามารถแก้ปัญหาของฉันได้

นี่คือรหัสของฉัน

{{#each OtherRandomItems}}

  {{this}}

  {{lookup ../AnotherRandomItems @index}}

  {{#if (lookup ../RandomItems @index)}}
  // render items
  {{else}}
  // render empty
  {{/if}}

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