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>.
Леонардо Раэле

236

Если у вас есть что-то, что вы хотите отобразить один раз и только если в массиве есть данные , используйте

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

.length вернет 0 для пустых массивов, поэтому мы достигли реального ложного значения.


1
Оба ответа верны и работают, и они отвечают на вопрос. Вот как что-то отображать, когда в массиве нет данных. А не наоборот.
Drejc

15
Нет, я согласен, это правильный ответ. Он не включает цикл for.
radtek

4
Простой случай: я хочу отобразить <ul>тег один раз и <li>тег для каждого элемента в списке. Если список пуст, я даже не хочу, <ul>чтобы рендеринг был, а рендеринг чего-то другого, например, <p>empty list<p>внутри <ul>, не имеет смысла.
Fuad Saud

2
Этот ответ зависит от реализации. В документации на руль указано, что []это оценивается как ложное. Ответ @Drejc - это правильный ответ по спецификации руля.
Стим,

1
Спасибо, чувак, это лучшее решение, чем registerHelper.
Датский

38

Хорошо, это проще, чем я думал:

{{#if items}}
// render items

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

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

5
Если itemsэто пустой массив (т.е. имеет значение []), он выдаст истинное значение. В то время как items.lengthпроизводит ложное значение для пустого массива. См . Ответ @ Duane .
gfullam

Ха ... 3 года прошло с тех пор ... может быть, реализация изменилась или у меня просто не было случая с массивом []. Насколько я помню, у меня это сработало.
Drejc

12
Ты прав. Я предупредительно заметил на основе поведения нативного JS» if, но документация Рули очень ясно:„Если его аргумент возвращается 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

Это отлично подходит для проверки между массивом и объектом и для обработки их по-разному.
Райан Уолтон

2

Для тех, кому нужно использовать {{#each}} поверх {{#if}} (т. Е. Цикл if внутри цикла for). Есть у них три разных списка массивов.

Использование поиска внутри оператора if решает проблему для меня. Поскольку приведенные выше ответы не решили мою проблему.

Вот мой код,

{{#each OtherRandomItems}}

  {{this}}

  {{lookup ../AnotherRandomItems @index}}

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

{{/each}}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.