如何根据集合的大小创建模板条件?

时间:2012-06-14 20:16:51

标签: meteor handlebars.js

我想做这样的事情:

<template name="list">
  <ul>
  {{#if items}}
      {{#each items}}
        <li>{{itemContents}}</li>
      {{/each}}
  {{else}}
    <li class="placeholder">There are no items in this list.</li>
  {{/if}}
  <ul>
</template>

其中items是Meteor.cursor:

Template.list.items = function() {
  return Items.find();
};

但是,上面的代码不起作用,因为即使没有项目,条件也会积极评估(这有点令人惊讶,因为Handlebars评估[]是假的)。我尝试将条件更改为

{{#if items.count}}

然后我得到了神秘的错误

Unknown helper 'items'

那么,有没有办法在流星Handlebars模板中写出这样的条件?

3 个答案:

答案 0 :(得分:32)

这是正确的方法:

<template name="list">
  <ul>
  {{#each items}}
    <li>{{itemContents}}</li>
  {{else}}
    <li class="placeholder">There are no items in this list.</li>
  {{/each}}
  <ul>
</template>

有关详细信息,请查看handlebarsjs.com

(Meteor使用的灵感来自Handlebars Spacebars。因此语法几乎相同。)

答案 1 :(得分:10)

通过使用with更改评估上下文,我能够让我的模板正常工作:

<template name="list">
  <ul>
  {{#with items}}
    {{#if count}}
        {{#each this}}
          <li>{{itemContents}}</li>
        {{/each}}
    {{else}}
      <li class="placeholder">There are no items in this list.</li>
    {{/if}}
  {{/with}}
  <ul>
</template>

请注意修改后的表达式{{#if count}}{{#each this}}

答案 2 :(得分:5)

过去几周我一直在评估Handlebars,我遇到了类似的问题。对我有用的是读取length属性并添加else标记。

    {{#if competitions.length}}
        <div class="game-score span-4"> 
        ...code goes here...    
        </div>
   {{else}}
        {{> allGameNotes}}
   {{/if}