handlerbars.js verifica se a lista está vazia


122

Existe uma maneira no Handlebars.js de modelo para verificar se a coleção ou lista é nula ou vazia, antes de ir e iterar pela lista / coleção?

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

{{/list}}



{{#each items}}

{{/each}}

Respostas:


209

A tag "each" também pode ter uma seção "else". Portanto, a forma mais simples é:

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

Isso é legal, mas não responde à pergunta. Se você deseja que uma tag seja quebrada #each, como uma <ul>tag (com <li>s dentro), não deseja que o estado vazio seja quebrado pelo <ul>.
Leonardo Raele 15/07/19

236

Se você tiver algo que deseja exibir uma vez e somente se a matriz tiver dados , use

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

.length retornará 0 para matrizes vazias, portanto, atingimos um valor real de falsey.


1
Ambas as respostas estão corretas e funcionam, e respondem à pergunta. Qual era como exibir algo quando não há dados na matriz. Não o contrário.
Drejc

15
Não, eu concordo, esta é a resposta correta. Não inclui um loop for.
Radtek 18/10/2014

4
Caso simples: desejo renderizar uma <ul>tag uma vez e uma <li>tag para cada item da lista. Se a lista estiver vazia, eu nem quero que o <ul>renderize, e renderizar algo como <p>empty list<p>dentro <ul>dele não faz sentido.
Fuad Saud

2
Esta resposta é específica da implementação. Os documentos do guidão especificam que []é avaliado como falso. A resposta do @Drejc é a resposta correta pela especificação do guidão.
Stim

1
obrigado cara, que é a solução muito melhor do que registerHelper.
Dinamarquês

38

Ok, é mais simples do que eu pensava:

{{#if items}}
// render items

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

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

5
Se itemsfor uma matriz vazia (ou seja, tem um valor de []), ela produzirá um valor verdadeiro. Considerando que items.lengthproduz um valor de falsey para uma matriz vazia. Veja a resposta de @ Duane .
Gfullam

Huh ... 3 anos se passaram desde ... pode ser que a implementação tenha mudado ou que eu simplesmente não tenha tido nenhum caso de [] array. Tanto quanto me lembro, funcionou para mim.
Drejc

12
Você está certo. I preventivamente comentou com base no comportamento de JS nativo' if, mas a documentação Handlebars é muito clara: 'Se seu argumento retornos false, undefined, null, "", 0, ou [], guidão não vai tornar o bloco.' Eu deveria ter verificado os documentos primeiro.
gfullam

8

Se você deseja verificar se uma coleção (cursor) está vazia ou não, as respostas anteriores não serão úteis. Em vez disso, você deve usar o count()método:

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

2
@BasicWolf não, count funciona com o cursor, se você tiver um array, use length.
Karl.S

Isso funciona muito bem para verificar entre uma matriz e um objeto e lidar com eles de maneira diferente.
22680 Ryan Walton #

2

Para quem precisa usar um {{#each}} em cima de {{#if}} (ou seja, um loop if dentro de um loop for). Eles têm três listas diferentes de matrizes.

Usar uma pesquisa dentro de uma instrução if resolve o problema para mim. Como, as respostas acima não resolveram meu problema.

Aqui está o meu código,

{{#each OtherRandomItems}}

  {{this}}

  {{lookup ../AnotherRandomItems @index}}

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

{{/each}}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.