10

In many templates I want to use the same functions, but they must defined in every template. like this:

function getNodesById(id){
    return collection.find({sid:id}).fetch();
}

Template.navigation.getNodesById= function(id){
    return getNodesById(id);
}

Template.body.getNodesById= function(id){
    return getNodesById(id);
}

Html:

<Template name="navigation">
... 
{{#each getNodesById '1'}}
...
{{/each}}
...
</Template>
<Template name="body">
...
{{#each getNodesById '1'}}
...
{{/each}}
...
</Template>
...
<Template name="...">
 .....
</Template>

Are There any way can defined globle template function instead of a template ? just like it: In javascript:

    defined global tempele.functionA = function(...){
         return ...
    }

in html:

<Template name ="a">
   {{#each  functionA ...}}
   {{/each }}
</Template>

<Template name ="b">
   {{#each  functionA ...}}
   {{/each }}
</Template>
<Template name="...">
    {{ #..  functionA ...}}
        ....
     {{/...}}
</Template >

Can I do this? I hope I described the problem clearly.

Keith Dawson
  • 1,475
  • 16
  • 27
L.T
  • 2,539
  • 3
  • 20
  • 30

3 Answers3

14

You can register your helpers with handlebars directly. This is what I am using for displaying the current users's email address:

Handlebars.registerHelper('currentUserName', function () {
    var user = Meteor.user();
    if (_.isUndefined(user) || _.isNull(user)) {
        return new Handlebars.SafeString("<i class='icon-spin icon-spinner'></i> Login");
    }
    return user.emails[0].address;
});

In any template I just call {{currentUserName}}. For you that'd be

Handlebars.registerHelper('getNodeById', function (id) {
    return collection.find({sid:id}).fetch();
});

As a side note: looking at how you want to use it, you might have gotten the idea of Meteor wrong. Meteor is data-driven - don't try to enforce flow-driven paradigms. If you are missing some data in your templates you should change the data-source, not just fetch it in your templates.

BenMorel
  • 34,448
  • 50
  • 182
  • 322
Fge
  • 2,971
  • 4
  • 23
  • 37
  • Thanks for your remind ,I think I was wrong at start.Meteor is data-driven,I'll keep that in mind。Thank you ! – L.T Mar 12 '13 at 02:10
13

As of Meteor 1.0, the documentation here instructs developers to use Template.registerHelper in order to define globally-available template helpers.

So in the case of this question, the correct code format would be this:

    Template.registerHelper("getNodesById", function(id) {
        return collection.find({sid: id});
    }

You could then reference this template helper in any of your templates in the following two ways:

    {{getNodesById '1'}}

or

    {{#each getNodesById '1'}}
      ...
    {{/each}}
Keith Dawson
  • 1,475
  • 16
  • 27
3

For Meteor 0.8 or higher, using UI.registerHelper will do the job.

Archy Will He 何魏奇
  • 9,589
  • 4
  • 34
  • 50