10

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

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中:

    已定义全局 tempele.functionA = function(...){
         返回 ...
    }

在 html 中:

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

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

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

4

3 回答 3

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 是数据驱动的——不要试图强制执行流驱动的范例。如果您的模板中缺少某些数据,您应该更改数据源,而不仅仅是在模板中获取它。

于 2013-03-11T12:26:25.143 回答
13

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

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

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

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

    {{getNodesById '1'}}

或者

    {{#each getNodesById '1'}}
      ...
    {{/each}}
于 2015-03-04T07:08:03.760 回答
3

对于 Meteor 0.8 或更高版本,使用UI.registerHelper就可以了。

于 2014-11-23T17:04:00.090 回答