Meteor中模板之间的函数共享

Meteor中模板之间的函数共享,meteor,Meteor,如果我有两个想要检查同一函数返回值的把手模板,该怎么办?有没有正确的方法?显然,我可以这样做: var say_foo = function() { alert('foo'); }; Template.foo.say_foo = say_foo; Template.bar.say_foo = say_foo; for (var t in Template) Template[t].say_foo = say_foo; 但是有没有办法直接通过模板对象来实现这一点?由于这是Java

如果我有两个想要检查同一函数返回值的把手模板,该怎么办?有没有正确的方法?显然,我可以这样做:

var say_foo = function() {
  alert('foo');
};

Template.foo.say_foo = say_foo;
Template.bar.say_foo = say_foo;
for (var t in Template)
    Template[t].say_foo = say_foo;
但是有没有办法直接通过模板对象来实现这一点?由于这是JavaScript,我可以将函数分配给任何对象的任何属性,但我尝试了以下操作:

Template.say_foo = function() { alert('foo'); };
当然,模板找不到这个函数


只是对最佳实践等感到好奇。谢谢

不确定我是否理解您的要求,但我看不出您所做的有任何错误-您为变量分配了一个函数以便多次重用它

如果你想减少输入量,或者让20个不同的模板而不是2个重复使用,你可以这样做:

var templates = ['foo', 'bar', 'baz', 'barz', 'bliz', blaz'];
for (var i=0; i < templates.length; i++) { 
    Template[templates[i]].say_foo = say_foo;
}

你目前的方法应该有效。较短的版本是:

Template.foo.say_foo = 
Template.bar.say_foo = function() { alert('foo'); };

我认为更好的版本是(如果您使用默认的把手):

您可以使用{{my_helper}}从任何模板调用它


希望有帮助:)

以下是我解决这个问题的方法。这是使用CoffeeScript完成的。如果不使用CoffeeScript,可以将其转换为JavaScript

首先,定义
extendTemplate
函数:

// Note: above code is probably simpler.

function extendTemplate(template, mixin) {
  if (mixin.helpers && template.helpers) {
    template.helpers(mixin.helpers);
  }
  if (mixin.events && template.events) {
    template.events(mixin.events);
  }
  return template;
};

extendTemplate(Template.register, {
  events: { ... },
  helpers: { ... },
});
extendTemplate=(模板,混合)->
helpers=({name,method}表示name,当name不是“events”时,mixin的方法)
模板[obj.name]=helpers中obj的obj.method
如果混入事件?
template.events?调用(template,mixin.events)
模板
然后,声明一个包含帮助程序和事件的对象(我的名为
loginMixin
),您希望在多个模板中共享这些帮助程序和事件:

loginMixin=
与电子邮件合并:->
return Session.get“帐户与电子邮件合并”
活动:
'单击按钮#合并登录':(事件、模板)->
email=$(template.find('#email')).val()
password=$(template.find('#password')).val()
Meteor.loginWithPassword电子邮件,密码,(错误)->
如果错误
console.error“登录失败”
返回错误
然后,在声明模板之后,可以使用上面的mixin扩展它们。使用以下代码,我扩展了我的
注册
登录
模板:

extendTemplate.register,loginMixin
extendTemplate Template.login,loginMixin
最后,下面是我的
login.html
的外观:


合并帐户

请使用{{merge_with_email}登录

电邮: 密码: 登录
由于我也扩展了我的
register
模板,
register.html
也可以使用
{merge\u with\u email}
,并处理
merge\u login
按钮的
单击事件。

根据Meteor文档,正确的方法是使用UI名称空间,它将绑定到下面使用的任何模板引擎,而不是直接使用把手或空格键。这里是文档中的链接

因此,要从client.js中使用的任何模板访问通用函数:

UI.registerHelper('stub', function() {
     // code
});

更新: 显然:


然后在html文件中使用
{{stub}
访问变量。

现在使用Meteor 1.0,这似乎已经改变了。经过一些挖掘,我发现您现在可以使用以下方法在助手之间重用代码:


这使它在所有帮助程序中都可用

在搞乱了Gezim的优秀答案后,我在Meteor 1.3+中意识到,你可以简单地运行:

Template.register.helpers(MyMixin.helpers);
Template.register.events(MyMixin.helpers);
但如果您想要一个extendTemplate函数:

// Note: above code is probably simpler.

function extendTemplate(template, mixin) {
  if (mixin.helpers && template.helpers) {
    template.helpers(mixin.helpers);
  }
  if (mixin.events && template.events) {
    template.events(mixin.events);
  }
  return template;
};

extendTemplate(Template.register, {
  events: { ... },
  helpers: { ... },
});

根据meteor文档,正确的方法是使用UI.registerHelper。请看下面我的答案。@srinivas:在流星的整个历史中,“正确的方式”发生了改变,它是车把,然后是UI,现在是模板。应编辑原始过时答案,而不是发布新答案,从而创建一个难以阅读的列表。我已经相应地更新了这个,因为它是第一个也是最新的upvoted@BogdanD对于在模板之间共享函数,我认为我们仍然必须将其注册为UI中的函数,否则您将无法在模板之间共享函数。是的,我本可以把答案放在评论中,但我认为这很难找到。@srinivas,我的意思是编辑答案,而不是评论(我对这个答案的编辑正在等待批准,这就是为什么答案中还没有)。关于用户界面-它现在被弃用了,模板取代了它。谢谢,当我发布这个问题时,我认为它不存在。为了保持这个问题的相关性,似乎应该将其更改为已接受的答案。文档现在已切换回使用
模板.registerHelper
。那么是全部还是全部?从语义上说,如果我创建一个子模板,我应该继承父模板的所有函数Doc location已更改为:Really cool,但是如何运行
template.instance()
在助手中获取模板?
Template.register.helpers(MyMixin.helpers);
Template.register.events(MyMixin.helpers);
// Note: above code is probably simpler.

function extendTemplate(template, mixin) {
  if (mixin.helpers && template.helpers) {
    template.helpers(mixin.helpers);
  }
  if (mixin.events && template.events) {
    template.events(mixin.events);
  }
  return template;
};

extendTemplate(Template.register, {
  events: { ... },
  helpers: { ... },
});