如何定义全局模板助手功能?

时间:2013-03-11 03:00:34

标签: javascript meteor spacebars meteor-helper

在许多模板中,我想使用相同的功能,但必须在每个模板中定义它们。 像这样:

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>

有没有办法可以定义全局模板功能而不是模板?就像它: 在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 >

我可以这样做吗?我希望我能清楚地描述这个问题。

3 个答案:

答案 0 :(得分:14)

您可以直接向手柄注册助手。这是我用于显示当前用户的电子邮件地址:

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;
});

在任何模板中,我只需拨打{{currentUserName}}。对你而言

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

作为旁注:看看你想如何使用它,你可能已经认识到Meteor的错误。 Meteor是数据驱动的 - 不要试图强制实施流驱动的范例。如果您缺少模板中的某些数据,则应更改数据源,而不仅仅是在模板中获取数据。

答案 1 :(得分:13)

从Meteor 1.0开始,文档here指示开发人员使用Template.registerHelper来定义全局可用的模板助手。

所以在这个问题的情况下,正确的代码格式是:

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

然后,您可以通过以下两种方式在任何模板中引用此模板助手:

    {{getNodesById '1'}}

    {{#each getNodesById '1'}}
      ...
    {{/each}}

答案 2 :(得分:3)

对于Meteor 0.8或更高版本,使用UI.registerHelper即可完成任务。