Search code examples
meteormeteor-blazespacebars

Passing spacebar data context from parent template to child


I am having a silly trouble with nested templates. I want to create a dropdown menu with 4 main categories and about 2-3 subcategories for each main category.

<template name="Warehouselist">
   <li class="dropdown">
    <a class="dropdown-toggle" data-toggle="dropdown" href="#"> {{warehouse}} <span class="caret"></span></a>
    <ul class="dropdown-menu">     
    {{#each Forms}}
      {{>Form}}  //Pass {{warehouse}} here
    {{/each}}                
    </ul>
  </li>
</template>
<template name="Form">
   <li id="EWPacking"><a href="#">{{FormName}}</a></li>
</template>

The problem is that I don't know how to pass the {{warehouse}} data to the child template's helper in order so I can do something like this.

  Template.bonus.helpers({
    Userform: function(){
      return UserForms.find({});
    },
    warehouse: function(){
      return Warehouse.find({});
    },
  });
  Template.Warehouselist.helpers({
    Forms: function(Warehouse){
      return Forms.find({Warehousename:Warehouse});
    }
  });

The point is that the helper of the child template has to return different data, depending on what is the Category of the parent element.


Solution

  • Use parent data context in the child template 'Form':

    <template name="Warehouselist">
        <li class="dropdown">
              <a class="dropdown-toggle" data-toggle="dropdown" href="#">{{warehouse}}<span class="caret"></span>
              </a>
            <ul class="dropdown-menu">
                {{#each Forms}}
                    {{>Form}}
                {{/each}}
            </ul>
        </li>
    </template>
    <template name="Form">
        <li id="EWPacking">
         <a href="#">{{FormName}} - {{../warehouse}}</a></li>
    </template>
    

    And change your javascript for the Warehouselist template helper. Get the warehouse from the data context with Template.currentData() and pass it in the Forms.find(). Like this:

    Template.Warehouselist.helpers({
        Forms: function(){
            var warehouse = Template.currentData().warehouse;
            console.log('warehouse:', warehouse);
            return Forms.find({Warehousename: warehouse});
        }
    });
    

    If you want to pass warehouse to the child template like you asked use: (BUT: this is not needed if you follow the solution above!)

    {{#each Forms}}
      {{>Form warehouse=warehouse}}
    {{/each}}