L.T L.T - 5 months ago 13
Javascript Question

How Do I Define a Global Template Helper Function?

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.

Fge Fge
Answer

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.

Comments