handlerbars.js перевірити, чи список порожній


122

Чи існує спосіб у шаблоні Handlebars.js перевірити, чи колекція чи список є нульовими чи порожніми, перед тим як перейти та повторити список / колекцію?

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

{{/list}}



{{#each items}}

{{/each}}

Відповіді:


209

Тег "кожен" також може приймати розділ "else". Тож найпростіша форма:

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

1
Це здорово, але не відповідає на питання. Якщо ви хочете, щоб тег загортався #each, як <ul>тег (з <li>s всередині), ви не хочете, щоб порожній стан був завернутий <ul>.
Леонардо Раель

236

Якщо у вас є щось, що ви хочете відобразити один раз, і лише якщо масив має дані , використовуйте

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

.length поверне 0 для порожніх масивів, щоб ми досягли реального значення фальси.


1
Обидві відповіді правильні і діючі, і вони відповідають на запитання. Що було як відобразити щось, коли в масиві немає даних. Не навпаки.
Дрейк

15
Ні, я не згоден, це правильна відповідь. Він не включає цикл for.
radtek

4
Простий випадок: я хочу зробити <ul>тег один раз та <li>тег для кожного елемента у списку. Якщо список порожній, я навіть не хочу, <ul>щоб його відображали, а рендеринг чогось іншого, як <p>empty list<p>всередині <ul>, не має сенсу.
Фуад Сауд

2
Ця відповідь є специфічною для впровадження. Документи рулі вказують, що []оцінюється як помилкове. Відповідь @Drejc - це правильна відповідь за специфікацією ручки.
Стім

1
дякую чувак, що це краще рішення, ніж registerHelper.
Датський

38

Гаразд, це простіше, ніж я думав:

{{#if items}}
// render items

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

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

5
Якщо itemsпорожній масив (тобто має значення []), він видасть триєдне значення. Тоді як items.lengthвиробляється значення фальси для порожнього масиву. Дивіться відповідь @ Дуейн .
gfullam

Так ... минуло вже 3 роки ... можливо, що реалізація змінилася або у мене просто не було жодного випадку [] масиву. Наскільки я пам'ятаю, це працювало на мене.
Дрейк

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.