handlerbars.js kiểm tra xem danh sách có trống không


122

Có cách nào trong tembars.js templating để kiểm tra xem bộ sưu tập hoặc danh sách là null hay trống, trước khi đi và lặp qua danh sách / bộ sưu tập không?

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

{{/list}}



{{#each items}}

{{/each}}

Câu trả lời:


209

Thẻ "mỗi" cũng có thể có phần "khác". Vì vậy, hình thức đơn giản nhất là:

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

Điều đó thật tuyệt, nhưng không trả lời được câu hỏi. Nếu bạn muốn một thẻ được bọc #each, như một <ul>thẻ (có <li>s bên trong), bạn không muốn trạng thái trống được bọc bởi <ul>.
Leonardo Raele

236

Nếu bạn có thứ gì đó muốn hiển thị một lầnchỉ khi mảng có dữ liệu , hãy sử dụng

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

.length sẽ trả về 0 cho các mảng trống để chúng tôi đã đạt được giá trị falsey thực sự.


1
Cả hai câu trả lời đều đúng và có tác dụng, và họ trả lời câu hỏi. Đó là cách hiển thị một cái gì đó khi không có dữ liệu trong mảng. Không phải hướng ngược lại.
Drejc

15
Không tôi đồng ý, đây là câu trả lời chính xác. Nó không bao gồm một vòng lặp for.
radtek

4
Trường hợp đơn giản: Tôi muốn kết xuất <ul>thẻ một lần và <li>thẻ cho từng mục trong danh sách. Nếu danh sách trống, tôi thậm chí không muốn <ul>kết xuất và hiển thị một cái gì đó khác như <p>empty list<p>bên trong <ul>không có ý nghĩa.
Fuad Saud

2
Câu trả lời này là thực hiện cụ thể. Các tài liệu tay lái xác định rằng []được đánh giá là sai. Câu trả lời của @Drejc là câu trả lời đúng theo thông số kỹ thuật của thanh điều khiển.
Kích thích

1
cảm ơn bạn đó là giải pháp tốt hơn so với registerHelper.
Đan Mạch

38

Ok nó đơn giản hơn tôi nghĩ:

{{#if items}}
// render items

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

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

5
Nếu itemslà một mảng trống (nghĩa là có giá trị []), nó sẽ tạo ra một giá trị trung thực. Trong khi đó items.lengthtạo ra một giá trị falsey cho một mảng trống. Xem câu trả lời của @ Duane .
gfullam

Huh ... 3 năm đã trôi qua kể từ khi ... có thể là việc triển khai đã thay đổi hoặc đơn giản là tôi không có trường hợp nào của mảng []. Theo như tôi nhớ nó đã làm việc cho tôi.
Drejc

12
Bạn đúng. Tôi preemptively nhận xét dựa trên hành vi của JS mẹ đẻ' if, nhưng các tài liệu hướng dẫn tay lái là rất rõ ràng: 'Nếu nó trở về lập luận false, undefined, null, "", 0, hay [], tay lái sẽ không làm cho khối.' Tôi nên đã kiểm tra các tài liệu đầu tiên.
gfullam

8

Nếu bạn muốn kiểm tra xem một bộ sưu tập (con trỏ) có trống hay không, các câu trả lời trước sẽ không hữu ích, thay vào đó bạn phải sử dụng count()phương thức:

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

2
@BasicWolf thì không, đếm hoạt động với con trỏ, nếu bạn có độ dài sử dụng mảng thay thế.
Karl.S

Điều này hoạt động rất tốt để kiểm tra giữa một mảng và một đối tượng và để xử lý chúng khác nhau.
Ryan Walton

2

Đối với bất kỳ ai cần sử dụng {{#each}} trên đầu {{#if}} (tức là một vòng lặp if bên trong vòng lặp for). Là họ có ba danh sách khác nhau của mảng.

Sử dụng tra cứu bên trong câu lệnh if sẽ giải quyết vấn đề cho tôi. Như, các câu trả lời trên không giải quyết được vấn đề của tôi.

Đây là mã của tôi,

{{#each OtherRandomItems}}

  {{this}}

  {{lookup ../AnotherRandomItems @index}}

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

{{/each}}
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.