在许多模板中,我想使用相同的功能,但必须在每个模板中定义它们。 像这样:
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 >
我可以这样做吗?我希望我能清楚地描述这个问题。
答案 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
即可完成任务。