如何从Meteor中的动态模板调用方法

时间:2015-08-06 03:04:05

标签: javascript meteor coffeescript meteor-blaze

我在Meteor中构建一个设置页面,其中包含许多类别设置的动态模板。

我尝试做的是在我的类别模板中有一个方法,当我点击父模板上的提交按钮时,该方法将被调用。

settings.html

<div>
  {{> Template.dynamic template=settings}}
  <div class="submit">
    <button>Save Changes</button>
  </div>
</div>

settings.coffee

Template.settings.events
    'click .submit button': ->
        dynamiclyLoadedTemplate.save()

my-dynamic-template.coffee

Template.dynamicTemplate.onCreated ->
    @save = ->
        # doSomething()

my-other-dynamic-template.coffee

Template.otherDynamicTemplate.onCreated ->
    @save = ->
        # doSomethingElse()

这可能吗?

我应该将这些方法创建为窗口方法而不是模板方法吗?

2 个答案:

答案 0 :(得分:1)

您可以在子模板中添加以下代码:

Template.childTemplate.onCreated ->

    settingsTemplate = this.parentTemplate(...) # ... = number of upstream levels
    settingsTemplate.child ?= []
    settingsTemplate.child.push this

    @save = ->
        console.log 'Save called'

因此,您可以在父模板上调用以下代码:

Template.parentTemplate.events

    'click .submit button': ->
        console.log 'submit button clicked'

        instance = Template.instance()

        if instance.child?.length > 0
            for child in instance.child
                child.save?()

答案 1 :(得分:0)

我有一个类似的模式,我只是将事件附加到父模板(加载动态模板的模板)。数据上下文将是父级的数据上下文,但是比将方法附加到 window 对象更好,特别是因为在我的情况下子模板都处理相同类型的对象

在您的情况下,首先将动态模板的父级设为模板本身:

<template name="parent">
  <div>
    {{> Template.dynamic template=settings}}
    <div class="submit">
      <button>Save Changes</button>
    </div>
  </div>
</template>

然后将事件附加到该父母:

Template.parent.events
    'click .submit button': ->
        save() // generic save function you've defined, for example in this file

当动态包含的模板具有相同类型的对象和通常类似的DOM元素时,这很有效,至少是那些要将事件附加到的元素。