handlerbars.js prüft, ob die Liste leer ist


122

Gibt es eine Möglichkeit in Handlebars.js Vorlagen, um zu überprüfen, ob die Sammlung oder Liste null oder leer ist, bevor die Liste / Sammlung durchlaufen wird?

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

{{/list}}



{{#each items}}

{{/each}}

Antworten:


209

Das "each" -Tag kann auch einen "else" -Abschnitt enthalten. Die einfachste Form ist also:

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

Das ist cool, beantwortet aber die Frage nicht. Wenn Sie möchten, dass ein Tag #eachwie ein <ul>Tag (mit <li>s im Inneren) umbrochen wird, möchten Sie nicht, dass der leere Status durch das umbrochen wird <ul>.
Leonardo Raele

236

Wenn Sie etwas haben, das Sie einmal und nur anzeigen möchten, wenn das Array Daten enthält , verwenden Sie

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

.length gibt 0 für leere Arrays zurück, sodass wir einen echten Falsey-Wert erreicht haben.


1
Beide Antworten sind richtig und funktionieren und beantworten die Frage. So wurde etwas angezeigt, wenn das Array keine Daten enthält. Nicht umgekehrt.
Drejc

15
Nein, ich stimme zu, das ist die richtige Antwort. Es enthält keine for-Schleife.
Radtek

4
Einfacher Fall: Ich möchte ein <ul>Tag einmal und ein <li>Tag für jedes Element in der Liste rendern . Wenn die Liste leer ist, möchte ich nicht einmal, dass die <ul>gerendert wird, und etwas anderes wie <p>empty list<p>in der zu rendern <ul>macht keinen Sinn.
Fuad Saud

2
Diese Antwort ist implementierungsspezifisch. In den Lenkerdokumenten wird angegeben, dass dies []als falsch bewertet wird. Die Antwort von @Drejc ist die richtige Antwort gemäß Lenkerspezifikation.
Stim

1
Danke Alter, das ist eine viel bessere Lösung als registerHelper.
Dänisch

38

Ok, es ist einfacher als ich dachte:

{{#if items}}
// render items

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

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

5
Wenn itemses sich um ein leeres Array handelt (dh einen Wert von hat []), wird ein wahrheitsgemäßer Wert erzeugt. Wohingegen items.lengtherzeugt einen Falsey Wert für eine leere Arrays. Siehe @ Duanes Antwort .
Gfullam

Huh ... 3 Jahre sind vergangen ... es könnte sein, dass sich die Implementierung geändert hat oder dass ich einfach keinen Fall von [] Array hatte. Soweit ich mich erinnere, hat es bei mir funktioniert.
Drejc

12
Du hast recht. Ich präventiv kommentierte basierend auf dem Verhalten von nativem JS‘ if, aber der Lenker Dokumentation ist sehr klar:‚Wenn ihr Argument zurückkehrt false, undefined, null, "", 0, oder [], Lenker nicht um den Block machen.‘ Ich hätte zuerst die Dokumente überprüfen sollen.
Gfullam

8

Wenn Sie überprüfen möchten, ob eine Sammlung (Cursor) leer ist oder nicht, sind die vorherigen Antworten nicht hilfreich. Stattdessen müssen Sie die folgende count()Methode verwenden:

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

2
@BasicWolf funktioniert nicht, count funktioniert mit dem Cursor, wenn Sie stattdessen die Länge des Arrays verwenden.
Karl.S

Dies funktioniert hervorragend, um zwischen einem Array und einem Objekt zu prüfen und sie unterschiedlich zu behandeln.
Ryan Walton

2

Für alle, die ein {{#each}} über {{#if}} verwenden müssen (dh eine if-Schleife innerhalb einer for-Schleife). Haben sie drei verschiedene Liste von Arrays.

Die Verwendung einer Suche in einer if-Anweisung löst das Problem für mich. Da die obigen Antworten mein Problem nicht gelöst haben.

Hier ist mein Code,

{{#each OtherRandomItems}}

  {{this}}

  {{lookup ../AnotherRandomItems @index}}

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

{{/each}}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.