这是我想出的解决问题的方法。这是使用 CoffeeScript 完成的。如果您不使用 CoffeeScript,可以在此处将其转换为 JavaScript 。
首先,定义extendTemplate
函数:
extendTemplate = (template, mixin) ->
helpers = ({name, method} for name, method of mixin when name isnt "events")
template[obj.name] = obj.method for obj in helpers
if mixin.events?
template.events?.call(template, mixin.events)
template
loginMixin
然后,声明一个您希望在多个模板之间共享的具有帮助器和事件的对象(我的称为):
loginMixin =
merge_with_email: ->
return Session.get 'account_merge__merge_with_email'
events:
'click button#merge_login': (event, template) ->
email = $(template.find('#email')).val()
password = $(template.find('#password')).val()
Meteor.loginWithPassword email, password, (error)->
if error
console.error "Failed to login."
return false
然后,在声明你的模板之后,你可以使用上面的 mixin 来扩展它们。使用以下代码,我正在扩展我的register
和login
模板:
extendTemplate Template.register, loginMixin
extendTemplate Template.login, loginMixin
最后,这是我的login.html
样子:
<template name="login">
<div class="alert">
<a class="close" data-dismiss="alert" href="#">×</a>
<h4 class="alert-heading">Merge accounts</h4>
<form id="register_form" class="form-inline" action="#">
<p class="help-block">Please login with {{merge_with_email}}.</p>
<label for="email">Email:</label>
<input id="email" type="text" class="input-medium" />
<label for="password">Password:</label>
<input id="password" type="password" class="input-medium" />
<button class="btn" id="merge_login">Login</button>
</form>
</div>
</template>
由于我也扩展了我的register
模板,register.html
因此也可以使用{{merge_with_email}}
并处理按钮的click
事件。merge_login