Search code examples
meteormeteor-blaze

Fastest way to check whether the cursor returned by a template helper is empty?


I often do something like this, using the items helper twice:

{{#if items}}
<h1>Items</h1>
  {{#each items}}
    {{> item}}
  {{/each}}
{{/if}}

Template.foo.helpers
  items: ->
    Items.find 
      bar: true
    , 
      sort: created: -1
      transform: (item) ->
        i.good = true
        i

Is Meteor doing extra work in this scenario? Would it be more efficient to switch the if to use something like areItems?

areItems: ->
  Items.find
    bar: true
  .count() > 0

Solution

  • In the template, you can use {{#with items}} and then either 'this.count' or 'this.length' to check whether your helper returned any items.

    Use this.count if 'items' is a cursor, e.g. the result of a find() operation:

    {{#with items}}
      {{#if this.count}}
        <h1>Items</h1>
        {{#each this}}
          {{> item}}
        {{/each}}
      {{/if}}
    {{/with}}
    

    Use this.length if 'items' is an array:

    {{#with items}}
      {{#if this.length}}
        <h1>Items</h1>
        {{#each this}}
          {{> item}}
        {{/each}}
      {{/if}}
    {{/with}}