Ответы:
Тег "each" также может принимать раздел "else". Итак, самая простая форма:
{{#each items}}
// render item
{{else}}
// render empty
{{/each}}
Если у вас есть что-то, что вы хотите отобразить один раз и только если в массиве есть данные , используйте
{{#if items.length}}
//Render
{{/if}}
.length
вернет 0 для пустых массивов, поэтому мы достигли реального ложного значения.
<ul>
тег один раз и <li>
тег для каждого элемента в списке. Если список пуст, я даже не хочу, <ul>
чтобы рендеринг был, а рендеринг чего-то другого, например, <p>empty list<p>
внутри <ul>
, не имеет смысла.
[]
это оценивается как ложное. Ответ @Drejc - это правильный ответ по спецификации руля.
Хорошо, это проще, чем я думал:
{{#if items}}
// render items
{{#each items}}
// render item
{{/each}}
{{else}}
// render empty
{{/if}}
items
это пустой массив (т.е. имеет значение []
), он выдаст истинное значение. В то время как items.length
производит ложное значение для пустого массива. См . Ответ @ Duane .
if
, но документация Рули очень ясно:„Если его аргумент возвращается false
, undefined
, null
, ""
, 0
, или []
, Рули не делают блок.“ Я должен был сначала проверить документы.
Если вы хотите проверить, пуста ли коллекция (курсор) или нет, предыдущие ответы не будут полезны, вместо этого вы должны использовать count()
метод:
{{#if items.count}}
<p>There is {{items.count}} item(s).</p>
{{else}}
<p>There is nothing</p>
{{/if}}
Для тех, кому нужно использовать {{#each}} поверх {{#if}} (т. Е. Цикл if внутри цикла for). Есть у них три разных списка массивов.
Использование поиска внутри оператора if решает проблему для меня. Поскольку приведенные выше ответы не решили мою проблему.
Вот мой код,
{{#each OtherRandomItems}}
{{this}}
{{lookup ../AnotherRandomItems @index}}
{{#if (lookup ../RandomItems @index)}}
// render items
{{else}}
// render empty
{{/if}}
{{/each}}
#each
, например<ul>
тег (с<li>
s внутри), вы не хотите, чтобы пустое состояние было заключено в оболочку<ul>
.