Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pass parameters to template without overriding data context

Tags:

meteor

I want to pass a new parameter to a template with keeping it's original data context.

  • original data context : {message:"hello"} {{> myTemplate withIcon=True}}
  • data context is overriden with {withIcon:True}

Acually my solution is to wrap data like this.

<code>
{{> myTemplate originalData=this withIcon=True}}
</code>

Is there a better solution ?

like image 333
Vincent Avatar asked Jan 18 '15 23:01

Vincent


2 Answers

You can always extend the current context in a helper:

Template.parentTemplate.helpers({
  iconContext: function() {
    var result = _.clone(this);
    result.withIcon = true;
    return result;
  }
});

And use it like this:

<template name="parentTemplate">
  {{> myTemplate iconContext}}
</template>

Alternatively, you could create a more generic helper like this:

Template.registerHelper('extendContext', function(key, value) {
  var result = _.clone(this);
  result[key] = value;
  return result;
});

And then choose the key/value pairs from within the html of any template:

<template name="parentTemplate">
  {{> myTemplate extendContext 'withIcon' true}}
  {{> myTemplate extendContext 'isAwesome' false}}
</template>

Either solution is more desirable than hiding the original data in a separate field, as it keeps the child template generic.

like image 193
David Weldon Avatar answered Nov 07 '22 04:11

David Weldon


Building on David's second option to allow for multiple attributes:

<template name="parentTemplate">
  {{> myTemplate extendContext withIcon=true label="Has Icon" }}
  {{> myTemplate extendContext withIcon=false label="No Icon" }}
</template>

and then in javascript:

Template.registerHelper('extendContext', function(data) {
  var result = _.clone(this);
  _.each(data.hash, function(value, key) {
    result[key] = value;
  })
  return result;
})
like image 22
Lance Anderson Avatar answered Nov 07 '22 04:11

Lance Anderson