typeofgraphic
typeofgraphic

Reputation: 322

Calling helper functions from within template.rendered in Meteor.js, error in 1.0, fine in 0.9.3

In an effort to avoid repeating code I found it useful to have helper functions that could be called from within a foo.rendered function (for instance). Why is this possible in 0.9.3 of Meteor, but throws an error in 1.0 ?

Template.foo.helpers({
  'fooFn' : function(){
     return "something"  
  }
});

Template.foo.rendered = function(){
  var something = Template.foo.fooFn();
}

Should I change the syntax in foo.rendered (am I calling it wrong?) or maybe use a different approach entirely (set up functions outside of the helpers({}) and rendered() and call those? or set this up as a registered helper function?

Upvotes: 2

Views: 3157

Answers (2)

Vincil Bishop
Vincil Bishop

Reputation: 1624

I think this would be a better method: How to use Meteor methods inside of a template helper

Define a function and attach it to the template. Call that function from rendered, as well as your template helper. Like MrMowgli said, you probably aren't "supposed" to call template helpers from within the .js file, only from the ...that could probably break in the future.

For example define a function and attach it to the tamplate:

Template.Play.randomScenario = function () { // HACK HACK HACK }

and then call it from your lifecycle method

Template.Play.created = function () {

  Template.Play.randomScenario();

};

scenario: function () {
    return Template.Play.randomScenario();;
  },

I had the same problem and this is the solution I used. Hope that helps.

Upvotes: 1

MrMowgli
MrMowgli

Reputation: 873

It looks like it is possible as of Meteor 1.0.3.1 to find and call helper functions, although it is clear it's not supposed to be used like this.

Still it can be done:

Template.foo.__helpers[" fooFn"]()

Please notice the leading space for the function name.

The other way of dealing with this is attaching a function to a global namespace, then calling that from somewhere else in your code, as user3557327 mentioned.

Additionally you can use:

Template.registerHelper('myHelper', function (){return 'Look At Me!'})

to register a global helper, and call it explicitly using:

UI._globalHelpers['myHelper']()

Upvotes: 5

Related Questions